7

x次のような波形がある場合

x = [math.sin(W*t + Ph) for t in range(16)]

任意Wの とPhで、その (実数) FFTfを で計算します

f = numpy.fft.rfft(x)

でオリジナルxを取得できます

numpy.fft.irfft(f)

ここで、復元された波形の範囲をサンプル数だけ左右に拡張する必要がある場合はどうすればよいでしょうか? つまり、 、、が元の波形の周期的な延長であるyような波形です。len(y) == 48y[16:32] == xy[0:16], y[32:48]

言い換えれば、FFT がその入力が でf(t)サンプリングされた無限関数であると想定している場合t = 0, 1, ... N-1、どうすればforの値を回復できますか?f(t)t<0t>=N

注:例として完全な正弦波を使用しましたが、実際には、 やxなどの任意の信号、またはランダム ファイルから取得した任意の長さのセグメントなど、何でもかまいx = range(16)ませんx = np.random.rand(16).wav

4

3 に答える 3

3

さて、復元された波形の範囲を左右にいくつかのサンプルに拡張する必要がある場合はどうなりますか?つまり、len(y)== 48、y [16:32] ==xおよびy[0:16]、y[32:48]が元の波形の周期的な拡張であるような波形yです。

周期的拡張も周期的拡張であるため、xだけです。

言い換えると、FFTが入力をt = 0、1、... N-1でサンプリングされた無限関数f(t)であると想定した場合、t <0およびtのf(t)の値をどのように復元できますか? > = N?

「NポイントFFTは、信号が周期性Nで周期的であると想定します。これは、ブロックが分解されるすべての高調波基本関数が、前のNサンプルと後続のNサンプルが単なるコピーであるように周期的であるためです。メインNサンプル。

入力に任意の値を許可するWと、周期性がNの正弦波は周期的ではなくなります。ただし、FFT関数がそれを多くの周期的正弦波の合計に分解するのを止めることはできません。また、周期性がNの周期的正弦波の合計も周期性がNになります。

明らかに、あなたは問題を再考しなければなりません。

多分あなたは線形予測を利用することができます。フラグメントのウィンドウ化された自己相関とレビンソン-ダービン再帰に基づいていくつかの線形予測係数を計算し、それらの予測係数を使用して外挿します。ただし、安定した予測フィルターの場合、予測はゼロに収束し、収束の速度は、使用している信号の種類によって異なります。たとえば、ホワイトノイズの完全な線形予測係数はすべてゼロです。その場合、左と右にゼロを「外挿」します。しかし、それについてできることはあまりありません。ホワイトノイズがある場合、すべてのサンプルが独立しているため、フラグメントには周囲のサンプルに関する情報がまったくありません(これがホワイトノイズです)。

この種の線形予測は、実際には正弦波サンプルを完全に予測することができます。したがって、入力が任意のWおよびpに対してsin(W * t + p)である場合、2次の線形予測のみが必要になります。より複雑な信号の場合は、10または16のオーダーをお勧めします。

于 2013-03-05T14:32:45.410 に答える
3

次の例は、その方法の良いアイデアを提供するはずです。

>>> x1 = np.random.rand(4)
>>> x2 = np.concatenate((x1, x1))
>>> x3 = np.concatenate((x1, x1, x1))
>>> np.fft.rfft(x1)
array([ 2.30410617+0.j        , -0.89574460-0.26838271j, -0.26468792+0.j        ])
>>> np.fft.rfft(x2)
array([ 4.60821233+0.j        ,  0.00000000+0.j        ,
       -1.79148921-0.53676542j,  0.00000000+0.j        , -0.52937585+0.j        ])
>>> np.fft.rfft(x3)
array([ 6.91231850+0.j        ,  0.00000000+0.j        ,
        0.00000000+0.j        , -2.68723381-0.80514813j,
        0.00000000+0.j        ,  0.00000000+0.j        , -0.79406377+0.j        ])

もちろん、3 つの周期を取得する最も簡単な方法は、時間領域で逆 FFT の 3 つのコピーを連結することです。

np.concatenate((np.fft.irfft(f),) * 3)

ただし、周波数ドメインでこれを行う必要がある場合は、次のことができます。

>>> a = np.arange(4)
>>> f = np.fft.rfft(a)
>>> n = 3
>>> ext_f = np.zeros(((len(f) - 1) * n + 1,), dtype=f.dtype)
>>> ext_f[::n] = f * n
>>> np.fft.irfft(ext_f)
array([ 0.,  1.,  2.,  3.,  0.,  1.,  2.,  3.,  0.,  1.,  2.,  3.])
于 2013-03-05T05:35:52.953 に答える
1

FFT アパーチャまたは長さで周期的な定常波形の場合、波形を周期的に繰り返すか、IFFT(FFT()) で再合成された同等の波形を時間領域で拡張することができます。FFT アパーチャまたは長さで周期的でないソースから時間的にウィドウした波形の場合、FFT の結果は、Sinc 関数で畳み込まれたスペクトルになります。そのため、ウィンドウ化されていない元のスペクトル コンテンツを復元するには、デコンボリューションに相当するものが必要になります。このデコンボリューションは困難または不可能であるため、最も一般的には、位相ボコーダー プロセスやその他の周波数推定器などの分析/再合成方法が代わりに使用されます。次に、これらの推定された周波数 (単一の生の FFT 結果のビン内の周波数とは異なる可能性がある) を、正弦波シンセサイザーのバンクに供給することができます。

于 2013-03-05T19:11:25.153 に答える