我需要帮助设置正确的频率向量

时间:2013-03-05 15:40:59

标签: matlab vector fft

我有一个频率为100赫兹的波(它是一组数据)。我想绘制幅度和相位角与频率的关系。 这就是我所做的,但我的振幅显示错误的频率,我错过了什么?

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

但我的振幅总是以错误的频率显示。我该怎么做才能解决这个问题? 谢谢

2 个答案:

答案 0 :(得分: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处有四个振幅尖峰。

这是另一个类似于你的代码的例子。

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)));

答案 1 :(得分:0)

您可以使用我的小工具easyFFT。除了FFT之外,它还能为您计算正确的频率向量。