基于Matlab的频谱计算方法
在Matlab中计算时间序列的频谱时,我有一个问题。我已经阅读了有关“fft”功能的文档。然而,我看到了两种实施方式,它们都给我带来了不同的结果。我希望能就这一差异给出一些答案: 第一种方法:基于Matlab的频谱计算方法,matlab,fft,time-series,Matlab,Fft,Time Series,在Matlab中计算时间序列的频谱时,我有一个问题。我已经阅读了有关“fft”功能的文档。然而,我看到了两种实施方式,它们都给我带来了不同的结果。我希望能就这一差异给出一些答案: 第一种方法: nPoints=length(timeSeries); Time specifications: Fs = 1; % samples per second Fs = 50; freq = 0:nPoints-1; %Numerators of frequency series freq = fre
nPoints=length(timeSeries);
Time specifications:
Fs = 1; % samples per second
Fs = 50;
freq = 0:nPoints-1; %Numerators of frequency series
freq = freq.*Fs./nPoints;
% Fourier Transform:
X = fft(timeSeries)/nPoints; % normalize the data
% find find nuquist frequency
cutOff = ceil(nPoints./2);
% take only the first half of the spectrum
X = abs(X(1:cutOff));
% Frequency specifications:
freq = freq(1:cutOff);
%Plot spectrum
semilogy(handles.plotLoadSeries,freq,X);
第二种方法:
NFFT = 2^nextpow2(nPoints); % Next power of 2 from length of y
Y = fft(timeSeries,NFFT)/nPoints;
f = 1/2*linspace(0,1,NFFT/2+1);
% % Plot single-sided amplitude spectrum.
% plot(handles.plotLoadSeries, f,2*abs(Y(1:NFFT/2+1)))
semilogy(handles.plotLoadSeries,f,2*abs(Y(1:NFFT/2+1)));
我认为在Matlab中的“fft”函数中没有必要使用“nextpow”函数。最后,哪一个是好的
谢谢简短的回答:您需要进行频谱分析 现在,对于长答案…在第二种方法中,当输入向量的长度为2的幂时,您使用的是一种优化的FFT算法。让我们假设您的原始信号有来自无限长信号的401个样本(如下例所示)
nextpow2()
将为您提供NFFT=512个样本。当您将较短的401采样信号馈送到fft()
函数时,它会隐式地加零,以匹配请求的512长度(NFFT
)。但是(这里有一个棘手的部分):对信号进行零填充相当于将无限长的信号乘以a,这一操作在频域转化为与a的卷积。这就是半对数图底部噪声地板增加的原因
避免这种噪声增加的一种方法是使用平滑器(而不是默认的矩形)手动创建要馈送到fft()
的512采样信号。加窗意味着将信号乘以一个锥形对称信号。关于选择一个好的窗口函数,有大量的文献,但是一个具有低旁瓣(低噪声增加)的典型精确函数是,在MATLAB中实现为hamming()
下图说明了问题(频域和时域):
…以及生成此图形的代码:
清除
%创建信号
fs=40;%采样频率。
Ts=1/fs;%采样周期
t=0:Ts:10;%时间向量
s=sin(2*pi*3*t);%原始信号
N=长度(s);
%FFT(长度不是2的幂)
S=abs(fft(S)/N);
freq=fs*(0:N-1)/N;
%FFT(2的长度幂)
N2=2^nextpow2(N);
S2=绝对值(fft(s,N2)/N2);
freq2=fs*(0:N2-1)/N2;
t2=(0:N2-1)*Ts;%长时间向量
s2=[s,零(1,N2-N)];%为该FFT隐式创建的信号
%FFT(FFT前加窗)
s3=[s.*hamming(N.),零(1,N2-N)];
S3=abs(fft(S3,N2)/N2);
%频域图
图(1)
子地块(211)
cla
符号学(freq,S);
等等
符号学(freq2,S2,'r');
符号学(freq2,S3,'g');
xlabel(“频率[Hz]”)
ylabel('FFT')
网格化
图例('FFT[401],'FFT[512],'FFT[512]加窗')
%时域图
小批(212)
cla
图则(s)
等等
图(s3,'g')
xlabel('索引')
ylabel(‘振幅’)
网格化
图例(‘原始样本’、‘窗口样本’)
简短回答:您需要进行频谱分析
现在,对于长答案…在第二种方法中,当输入向量的长度为2的幂时,您使用的是一种优化的FFT算法。让我们假设您的原始信号有来自无限长信号的401个样本(如下例所示)nextpow2()
将为您提供NFFT=512个样本。当您将较短的401采样信号馈送到fft()
函数时,它会隐式地加零,以匹配请求的512长度(NFFT
)。但是(这里有一个棘手的部分):对信号进行零填充相当于将无限长的信号乘以a,这一操作在频域转化为与a的卷积。这就是半对数图底部噪声地板增加的原因
避免这种噪声增加的一种方法是使用平滑器(而不是默认的矩形)手动创建要馈送到fft()
的512采样信号。加窗意味着将信号乘以一个锥形对称信号。关于选择一个好的窗口函数,有大量的文献,但是一个具有低旁瓣(低噪声增加)的典型精确函数是,在MATLAB中实现为hamming()
下图说明了问题(频域和时域):
…以及生成此图形的代码:
清除
%创建信号
fs=40;%采样频率。
Ts=1/fs;%采样周期
t=0:Ts:10;%时间向量
s=sin(2*pi*3*t);%原始信号
N=长度(s);
%FFT(长度不是2的幂)
S=abs(fft(S)/N);
freq=fs*(0:N-1)/N;
%FFT(2的长度幂)
N2=2^nextpow2(N);
S2=绝对值(fft(s,N2)/N2);
freq2=fs*(0:N2-1)/N2;
t2=(0:N2-1)*Ts;%长时间向量
s2=[s,零(1,N2-N)];%为该FFT隐式创建的信号
%FFT(FFT前加窗)
s3=[s.*hamming(N.),零(1,N2-N)];
S3=abs(fft(S3,N2)/N2);
%频域图
图(1)
子地块(211)
cla
符号学(freq,S);
等等
符号学(freq2,S2,'r');
符号学(freq2,S3,'g');
xlabel(“频率[Hz]”)
ylabel('FFT')
网格化
图例('FFT[401],'FFT[512],'FFT[512]加窗')
%时域图
小批(212)
cla
图则(s)
等等
图(s3,'g')
xlabel('索引')
ylabel(‘振幅’)
网格化
图例(‘原始样本’、‘窗口样本’)