DFT和FFT功率(波数)谱分析

参考帖子
https://www.mathworks.com/matlabcentral/answers/24965-fft2-function-in-matlab
一维傅里叶变换
Y(omega)=【f(t)exp(-iomega*t)*dt】
【】表示负无穷到正无穷积分
对时间变换得到的是频率谱,omega=2 * pi * f,为圆频率,f为频率,单位s-1,即赫兹,单位时间内的cycle数
对空间变换得到的是波数谱,omega=2 * pi * k,k为波数,单位为m-1,单位空间内的cycle数
编程时积分改为累加,即离散傅里叶变换(DFT)

matlab里有fft函数,采用快速傅里叶变换(FFT)方法,大大节省计算量
FFT原理为将2的n次方长度(缺少补零)的序列分为奇数列和偶数列,通过它们之间的关系,将序列不断一分为二,最后得到最短的序列再用DFT方法求解。
两者得到的结果是一致的。

matlab 还有pwelch函数用于计算功率谱,其中采用加窗、分段(各段之间有重叠)平均、fft方法求解功率谱,相比直接采用fft方法,增加了自由度、可靠性、并减少了能量泄露和旁瓣效应(离散采样导致的,峰值功率减弱,并在两侧出现小的波动峰值),并且提供了置信度区间计算。

下面的程序分别采用DFT、FFT和pwelch方法求解同一时间序列功率谱,并进行了比较

%%  DFT
clear;clc;close all;
Fs=1/86400;   % sample frequency: 1 day
n=0:1023;     % number of points
t=n/Fs;       % time
per1=4;       % periodicity 1: 4 days
per2=8;
data=cos(2*pi/(86400*per1)*t)+2*cos(2*pi/(86400*per2)*t)+randn(size(t));    %% *dt??
figure
plot(t/86400,data)
xlabel('time(days)');
ylabel('amplitude');
title('data');


Nt=length(n);     % number of points
dt=1/Fs;          % time increment
f_N=Fs/2;         % Nyquist frequency
df=Fs/Nt;         % Frequency increment
freq=-f_N:df:f_N-df;  % Frequency range (centered)

data_frequency = zeros(size(data));
% Compute 1D Discrete Fourier Transform
for j1 = 1 : Nt
 for j2 = 1 : Nt
   data_frequency(j1) = data_frequency(j1) + ...
                        data(j2)*exp(-1i*(2*pi)*(freq(j1)*t(j2)));
 end
end
%此处 j1为对应omega的下标,j2为对应t的下标

% here we calculate centered frency range, convert it to one-sided frequency
% range
plot_pdata=10*log10(abs(data_frequency(Nt/2+1:end)).^2/Nt);
plot_freq=freq(Nt/2+1:end)*86400;

figure
plot(plot_freq,plot_pdata);
xlabel('frequency(cpd)');ylabel('Spectral /dB');
title('DFT');


%% FFT
pdata=fft(data);

% FFT calculate two-sided frency range, convert it to one-sided frequency
% range
figure
plot_pdata=10*log10(abs(pdata(1:Nt/2).^2/Nt));
plot_freq=freq(1:Nt/2)*86400;
plot(plot_freq,plot_pdata(1:Nt/2));
xlabel('freq');ylabel('Spectral /dB');
title('FFT');


%%   function pwelch
% window=boxcar(Nt);   %矩形窗
% window=hamming(Nt);  %海明窗
% window=blackman(Nt);   %blackman窗
noverlap=[];           %数据重叠
window=200;
range='onesided';      %频率间隔为[0 Fs/2],只计算一半的频率
[pdata,fout]=pwelch(data,window,noverlap,Nt,Fs,range);
plot_pdata=10*log10(pdata/Nt);

figure
X=fout*86400;
plot(X,plot_pdata);
xlabel('freq');ylabel('Spectral /dB');
title('pwelch');

二维傅里叶变换

%二维数据,列代表空间,行代表时间,二维傅里叶变换后得到频率-波数关系即频散关系。
%此处用随机数据分析,fftshift后,以0作为频率中心
%给出了DFT和fft2函数之间的比较,在精度允许的范围内,两者结果一致
Nx = 64; % Number of samples collected along first dimension
Nt = 32; % Number of samples collected along second dimension
dx = 1;  % Distance increment (i.e., Spacing between each column)
dt = .1; % Time increment (i.e., Spacing between each row)
x = 0 : dx : (Nx-1)*dx; % distance
t = 0 : dt : (Nt-1)*dt; % time
data_spacetime = randn(Nt,Nx); % random 2D matrix
Nyq_k = 1/(2*dx); % Nyquist of data in first dimension
Nyq_f = 1/(2*dt); % Nyquist of data in second dimension
dk = 1/(Nx*dx);   % Wavenumber increment
df = 1/(Nt*dt);   % Frequency increment
k = -Nyq_k : dk : Nyq_k-dk; % wavenumber
f = -Nyq_f : df : Nyq_f-df; % frequency
data_wavenumberfrequency = zeros(size(data_spacetime)); % initialize data
% Compute 2D Discrete Fourier Transform
for i1 = 1 : Nx
for j1 = 1 : Nt
for i2 = 1 : Nx
 for j2 = 1 : Nt
  data_wavenumberfrequency(j1,i1) = data_wavenumberfrequency(j1,i1) + ...
   data_spacetime(j2,i2)*exp(-1i*(2*pi)*(k(i1)*x(i2)+f(j1)*t(j2)))*dx*dt;
 end
end
end
end
figure;
subplot(3,1,1);
imagesc(k,f,abs(data_wavenumberfrequency));
colorbar; v = caxis;
title('2D DFT');
fft2result = fftshift(fft2(data_spacetime))*dx*dt;
subplot(3,1,2);
imagesc(k,f,abs(fft2result));
colorbar; caxis(v);
title('FFT2');
subplot(3,1,3);
imagesc(k,f,abs(fft2result-data_wavenumberfrequency));
colorbar; caxis(v);
title('Difference');
  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
谱分析是一种用于分析信号频特征的方法。DFT(离散傅里叶变换)和FFT(快速傅里叶变换)是两种常用的谱分析方法。 DFT是将离散信号转换为连续频的一种变换方法。通过DFT,可以将一个时域信号转换成其频域表示。DFT转换结果包含了信号在不同频率上的幅度和相位信息,用频表示。然而,DFT的计算复杂度较高,当信号长度增加时,计算量会快速增加。 为了解决DFT计算复杂度高的问题,FFT算法被发明出来,它是一种高效的计算DFT的方法。FFT算法通过将DFT递归分解为更小的计算问题,大大减少了计算的复杂度。FFT算法的核心思想是利用了信号的对称性,重复计算可以避免,只需计算部分频率即可得到完整的频。 使用DFTFFT进行谱分析可以帮助我们了解信号的频特征。通过对信号进行DFTFFT变换,我们可以得到信号在不同频率上的能量分布情况。频可以显示信号在不同频率上的幅度和相位信息,从而帮助我们分析信号中包含的频率成分。 谱分析在许多领域都有广泛的应用。在音频处理中,我们可以通过谱分析来分析音乐的频特征,从而实现音频剪辑、去噪等功能。在通信领域,谱分析可以用来分析信号的频分布,从而帮助我们设计合适的调制方案。在故障诊断中,谱分析可以用来分析机械振动信号的频特征,从而判断机器是否存在故障。 综上所述,DFTFFT是常用的谱分析方法。它们通过将时域信号转换为频域信号,帮助我们了解信号的频特征,从而应用于各种领域中的信号处理和分析任务中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值