如何在MATLAB中绘制fft的ascii值?

时间:2013-07-24 08:28:34

标签: matlab plot ascii fft dft

我有一个包含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)|')

2 个答案:

答案 0 :(得分:4)

不应直接进入MATLAB的FFT例程,而应考虑使用periodogram函数。当人们说“FFT”时,它们通常表示PSD或周期图,即使用适当加窗和FFT样本的功率谱密度图。 MATLAB中的periodogram函数会为您处理所有细节,即应用窗口函数,计算FFT,从FFT输出中导出幅度,适当缩放轴,甚至根据需要进行绘图。

注意:periodogram位于MATLAB信号处理工具箱中 - 如果您无权访问,那么您可以考虑使用Octave(免费的MATLAB克隆),其中periodogram克隆,否则你需要自己把各种构建块放在一起:

  • 窗口功能
  • FFT
  • 计算幅度
  • 考虑缩放频率和幅度值
  • 情节PSD

答案 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)|')

信号如下:

enter image description here

和这样的FFT:

enter image description here

注意:如果您以40 kHz采样,则FFT最高可达20kHz(奈奎斯特频率)。