Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Matlab的频谱计算方法_Matlab_Fft_Time Series - Fatal编程技术网

基于Matlab的频谱计算方法

基于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

在Matlab中计算时间序列的频谱时,我有一个问题。我已经阅读了有关“fft”功能的文档。然而,我看到了两种实施方式,它们都给我带来了不同的结果。我希望能就这一差异给出一些答案:

第一种方法:

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(‘振幅’)
网格化
图例(‘原始样本’、‘窗口样本’)