0

周波数100 Hzの波があります(データのセットです)。振幅と位相角と周波数をプロットしたいと思います。これは私がしていることですが、振幅が間違った周波数で表示されます。何が欠けていますか?

given x=[....] set of data representing wave of frequency = 100 Hz, of length 1500.
first: Nfft = 2^nextpow2(length(x));
second: Fs = 1000; (that is 10 times my frequency of 100, is that correct?)
third: get fft : xdft = fft(x,Nfft);
forth: get amplitude: amp = abs(xdft);
fifth: get phase :    ang = unwrap(angle(xdft));

今私の主な問題は、周波数ベクトルを正しく設定することです。これが私がしたことです

f_fold = Fs/2; % folding frequency = max frequency of FFT (Hz)
T = Nfft/Fs % total sample time (s)
del_f = 1/T; % (Hz)
f_v = [0:del_f:f_fold]'; % frequency (Hz)

また、matlab の提案を試しました: f_v = Fs*(0:Nfft-1)/Nfft

しかし、私の振幅は常に間違った周波数で表示されます。これを修正するにはどうすればよいですか? ありがとうございました

4

2 に答える 2

3

まず、FS (サンプリング周波数) は任意ではありません。時間領域で一連のデータが与えられた場合、そのデータのサンプリング周波数は既に決定されています。アップサンプリング (既存のデータ ポイント間の補間) によって高いサンプリング周波数を取得するか、データ ポイントを削除することによって低いサンプリング周波数 (ダウンサンプリング) を取得できます。

次に、Matlab で行ベクトルの fft を取得すると、次のようになります。

[positive frequency data, negative frequency data]

関数fftshiftを使用して、これをより「見やすい」形式にすることができます。

fftshift(fft(x))

戻ります

[negative frequency data, positive frequency data]

あなたのデータセットがなければ、なぜあなたの振幅が一致しないのかについて正確な解決策を提供することはできません (ただし、サンプリング周波数の選択に関係していると思われます)。ただし、ここでは概念を示す例を示します。

fs = 500; % 500 Hz sampling frequency: 500 > 2*100 => satifies Nyquist
t = 0:1/fs:10; % 10 seconds of data sampled at fs
y = sin(2*pi*100.*t) + sin(2*pi*25.*t); % Two sinusoids at 25 Hz and 100 Hz
Y=fftshift(fft(y));
f=linspace(-fs/2, fs/2, length(Y));
plot(f, abs(Y));

-100、-25、25、および 100 に 4 つの振幅スパイクがあるはずです。

コードにもう少し似ている別の例を次に示します。

fs = 500; % 500 Hz sampling frequency: 500 > 2*100 => satifies Nyquist
t = 0:1/fs:10; % 10 seconds of data sampled at fs
y = sin(2*pi*100.*t) + sin(2*pi*25.*t); % Two sinusoids at 25 Hz and 100 Hz
NFFT = 2^nextpow2(y); %8192
Y=fft(y, NFFT);
delta_f = fs/(NFFT-1);
f=0:delta_f:fs/2;
plot(f, abs(Y(1:length(f)));
于 2013-03-05T16:41:59.137 に答える