0

matlab で単純な (オーディオ) 信号の位相を回復しようとしています: matlab では、次のことを行います。

% This wave is perfectly periodic in the sample.  That is, 
% there are exactly 1000 periods.
swave = sin( 2 * pi * (0:10000) * 441/44100);

% Find the fft
sFFT = fft(swave);
% Remove the duplicate data in the FFT
sFFT = sFFT(1:length(sFFT)/2);

% Take a look a the amplitudes from the FFT and it checks out
freqs = 44100/ 2*linspace(0,1,length(sFFT);
plot(freqs, abs(sFFT));

% Now to get the phase
plot(freqs, angle(sFFT));

この結果は私にはほとんど意味がありません。これは正弦波だからです(cos波ではありません)。441hz ビンの値は 1/2*pi = 1.57079 になると思います。代わりに、(441, -1.53​​9) から (445, 1.603) へのほぼ不連続なジャンプが見られます。441 が正しい値からかけ離れているのはなぜですか? 445がこんなに近いのはなぜ?

441 hz 以外のすべてのビンの値は、私には謎です。unwrap(angle(sFFT)) や atan2(imag(sFFT), real(sFFT)); など、位相を回復する他の方法もいくつか試しました。これらは出力を変更しますが、私には意味がありません。441 以外のビンが 0 以外の値になるのはなぜですか (abs(FFT) が示すように?)。441 ビンが近いのに正しい値ではないのはなぜですか?

助けてくれてありがとう!

4

1 に答える 1

0

位相をより適切に推定するには、fftshift を実行して 0 位相基準をウィンドウの中心に変更します。これにより、ほとんどの交番位相の不連続が除去され、補間が行われますが、0 点が変更されたことに注意してください。

ほとんどの場合、長さゼロのベクトルの位相は意味がないことに注意してください。したがって、近いものは、有限精度の計算による単なる数値ノイズ (さまざまなランダムな方向のゼロに近いベクトル) である可能性があります。

したがって、一部の人々は、プロットされた位相を、あるノイズ フロアより下の振幅に対してゼロにクランプするだけです。

于 2013-03-21T20:38:05.677 に答える