2

平均法を使用して、固定[Mx1]ベクトルを任意の[Nx1]次元にダウンサンプリングしようとしています。必要な出力配列に応じて毎回変化する動的なウィンドウ サイズがあります。そのため、場合によっては、幸運にもウィンドウサイズに完全に適合する int のウィンドウサイズを取得し、ウィンドウサイズとして浮動小数点数を取得することもあります。しかし、浮動サイズのウィンドウを使用して、固定[Mx1]ベクトルから[Nx1]サイズのベクトルを作成するにはどうすればよいですか?

以下は私が試したコードです:

chunk = 0.35
def fixed_meanVector(vec, chunk):
   size = (vec.size*chunk) #size of output according to the chunk
   R    = (vec.size/size) #windows size to transform array into chunk size
   pad_size = math.ceil(float(vec.size)/R)*R - vec.size
   vec_padded = np.append(vec, np.zeros(pad_size)*np.NaN)

   print "Org Vector: ",vec.size, "output Size: ",size, "Windows Size: ",R, "Padding size", pad_size
   newVec = scipy.nanmean(vec_padded.reshape(-1,R), axis=1)
   print "New Vector shape: ",newVec.shape
   return newVec

print "Word Mean of N values Similarity: ",cosine(fixed_meanVector(vector1, chunk)
                                                      ,fixed_meanVector(vector2, chunk))

出力:

New Vector shape:  (200,)
Org Vector:  400 output Size:  140.0 Windows Size:  2.85714285714 Padding  size 0.0
New Vector shape:  (200,)
0.46111661289

上記の例では、[Mx1] ([400x1])ベクトルをNx1 ([140x1])次元でダウンサンプリングする必要があります。したがって、動的にウィンドウ サイズ[2.857x1]を使用して[Mx1] vector をダウンサンプリングできます。しかし、この場合、 [140x1] ではなく[200x1]のベクトルを出力として取得しています。これは、-> [2x1]でダウンサンプリングされた小麦粉 (2.85)に発生するフローティング ウィンドウのためです。私のウィンドウサイズは新しい[Nx1]次元にぴったりなので、パディングはゼロです。では、 [Mx1]ベクトルをダウンサンプリングするために、そのようなタイプのウィンドウ サイズを使用する方法はありますか?

4

2 に答える 2

2

あなたはそれを間違っています.必要な間引きのためのウィンドウを構築します.逆ではありません.

Nyquist 氏は、fs/2 を超える BW を持つことはできないと言っています。

したがって、それを解決するには、単に「平均化」するのではなく、fs/2 を超える周波数が許容ノイズフロアを下回るようにローパスします。

MAは有効なタイプのローパス フィルターです。間違った配列に適用しているだけです。

任意のデシメーションの通常のケースは次のとおりです。

 Upsample -> Lowpass -> Downsample

したがって、N から M のサンプルを任意にデシメートできるようにするためのアルゴリズムは次のとおりです。

  • 現在のサンプルとターゲット サンプルの間のLCMを見つけます。
  • アップサンプルLCM/N
  • 停止周波数を使用してフィルターを設計するws<= M/LCM
  • ダウンサンプリングLCM/M

あなたが平均法と呼ぶものは、長方形のウィンドウを持つFIRフィルターです

そのウィンドウの周波数応答の最初のゼロをストップ バンドとして使用すると、必要なウィンドウ サイズ K を次のように計算できます。

2/K <= M/LCM

したがって、次のサイズのウィンドウを使用する必要があります。

ceil(2*LCM/M) = K

もちろん、これらすべてを実装する必要はありません。適切なウィンドウを設計し、scipy.signal.resamplews<= M/LCMを使用して適用するだけです。

またceil、ウィンドウに適用すると結果が台無しになる場合は、長方形のウィンドウを使用しないでください。使用できる優れたフィルターがたくさんあります。

于 2016-03-30T07:12:47.833 に答える