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 处有四个幅度尖峰。

这是另一个更类似于您的代码的示例。

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 回答
0

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

于 2020-08-31T13:22:09.120 回答