如何用MatLab生成对数尺度FFT

如何用MatLab生成对数尺度FFT,matlab,fft,Matlab,Fft,这是我第一次使用MathWorks网站上的一些示例代码在MatLab中执行FFT。我想知道是否有可能将我的代码转换为对数比例表示,而不是线性表示。我理解大部分代码,但是除了行末尾的+1之外,我仍然不能100%确定它到底在做什么,这是因为MatLab的索引结构不是从0开始的 到目前为止,我的代码是: [y,fs] = wavread('Wav/800Hz_2sec.wav'); NFFT = 4096; Y = fft(y,NFFT)/length(y); f = fs/2*linspace(0,

这是我第一次使用MathWorks网站上的一些示例代码在MatLab中执行FFT。我想知道是否有可能将我的代码转换为对数比例表示,而不是线性表示。我理解大部分代码,但是除了行末尾的
+1
之外,我仍然不能100%确定它到底在做什么,这是因为MatLab的索引结构不是从
0
开始的

到目前为止,我的代码是:

[y,fs] = wavread('Wav/800Hz_2sec.wav');
NFFT = 4096;
Y = fft(y,NFFT)/length(y);
f = fs/2*linspace(0,1,NFFT/2+1);
plot(f,2*abs(Y(1:NFFT/2+1))

频率通常由离散傅里叶变换以线性尺度表示。如果需要,可以在对数比例中创建新的频率向量,并对已有的结果进行插值

fnew=fs/2.*logspace(log10(fs/length(y)),0,npts);
Ynew= interp1(f,Y(1:NFFT/2+1),fnew);
其中,
npts
是新频率向量的长度。只是为了策划

loglog(f,2*abs(Y(1:NFFT/2+1));

老实说,在我看来,插值效果不太好,因为实际信号的FFT会在频谱中产生很强的波峰和波谷,因此,除非首先平滑频谱,否则插值频谱看起来不会很好

如果只想对x轴进行对数化,使用
semilogx
而不是
loglog
。或者在
绘图
行后等效地进行
设置(gca,'xscale','log')