我有一个包含2048 x和y值对的ascii文件。我只想知道如何在MATLAB中绘制fft的fft。我按照MATLAB代码编写,但无法找到合适的结果。
我该怎么做?这就是我的尝试:
I = load('data1.asc');
for i = 1:2048
y = I(:,2);
end
plot(x)
Fs = 40000;
T = 1/Fs;
L = 2000;
NFFT = 2^nextpow2(L);
Y = abs(fft(y,NFFT))/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
figure, plot(f,2*abs(Y(1:NFFT/2+1)))
axis([0 40000 0 40])
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
答案 0 :(得分:4)
不应直接进入MATLAB的FFT例程,而应考虑使用periodogram函数。当人们说“FFT”时,它们通常表示PSD或周期图,即使用适当加窗和FFT样本的功率谱密度图。 MATLAB中的periodogram函数会为您处理所有细节,即应用窗口函数,计算FFT,从FFT输出中导出幅度,适当缩放轴,甚至根据需要进行绘图。
注意:periodogram
位于MATLAB信号处理工具箱中 - 如果您无权访问,那么您可以考虑使用Octave(免费的MATLAB克隆),其中periodogram
克隆,否则你需要自己把各种构建块放在一起:
答案 1 :(得分:1)
代码的fft
部分对我来说很好看。但是,这一点并没有多大意义:
for i = 1:2048
y = I(:,2);
end
你想在这做什么?您在for循环中根本没有使用循环索引i
。
另外,我假设y
长度为2000,你能证实吗?否则,L = 2000
应更改为L = length(y)
。同样,我假设数据的采样频率为40kHz,否则Fs = 40000
不正确。
在评论中讨论后编辑:
根据您提供的数据,我得到相同的结果。我做的唯一一件事就是当它下降到零时从分析中排除最后一个数据点。您阅读数据的方式对我来说仍然没有意义。注意我使用的是Octave,而不是MATLAB,但代码应该在MATLAB中给出相同的结果。
load('ascii_value.txt')
y = ascii_value(1:end-1,2);
plot(y)
L=length(y);
Fs = 40000;
T = 1/Fs;
NFFT = 2^nextpow2(L);
Y = abs(fft(y,NFFT))/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
figure, plot(f,2*abs(Y(1:NFFT/2+1)))
axis([0 40000 0 40])
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
信号如下:
和这样的FFT:
注意:如果您以40 kHz采样,则FFT最高可达20kHz(奈奎斯特频率)。