细化FFT(Zoom—FFT)

在频谱分析过程中经常会遇到密集频谱的现象,就是许多谱线集中在某个区域中难以区分。要解决密集频谱问题最好的方法是细化谱分析,又称为频谱细化分析方法。频谱细化分析方法都是在复调制下进行的,即把信号复调制移频,使要了解的那段频带谱移到零频附近,再进行傅里叶分析。一般称为Zoom-FFT(ZFFT)方法,即细化FFT方法。

经典的复调制频谱细化分析方法

经典的复调制频谱细化FFT步骤为:复调制移频→低通数字滤波→重采样→FFT及谱分析→频率调整。其原理过程如下图所示。

细化FFT(Zoom—FFT)_第1张图片

经典复调制频谱细化分析的MATLAB函数
名称:exzfft_ma
功能:复调制频谱细化分析
调用格式:
[y,freq]= exzfft_ma(x,fe,fs,nfft,D)

说明:其中输入变量x是被测信号,x的长度要大于等于nfft*D,fe是细化区间的中心频率,fs是采样频率,nfft是细化FFT的长度,D是细化倍数。输出变量y是细化FFT后的输出,是一个复数序列;freq是细化FFT后的频率刻度。

函数程序如下:

function [y,freq,c]=exzfft_ma(x,fe,fs,nfft,D)
nt=length(x);           % 计算读入数据长度
fi=fe-fs/D/2;           % 计算细化截止频率下限
fa=fi+fs/D;             % 计算细化截止频率上限
na=round(0.5 * nt/D+1); % 确定低通滤波器截止频率对应的谱线条数
% 频移
n=0: nt-1;              % 序列索引号
b=n*pi* (fi+fa)/fs;     % 设置单位旋转因子
y=x.*exp(-1i*b);        % 进行频移 
b= fft(y, nt);          % FFT
% 低通滤波和下采样
a(1: na) =b(1: na);     % 取正频率部分的低频成分
a(nt-na+2 : nt) =b(nt-na+2 : nt); % 取负频率部分的低频成分
b=ifft(a, nt);          % IFFT 
c=b(1 : D: nt);         % 下采样
% 求细化频谱
y=fft(c, nfft) * 2/nfft;% 再一次FFT
y=fftshift(y);          % 重新排列
freq=fi+(0:nfft-1)*fs/D/nfft; % 频率设置

案例、设有一振动信号,信号由6个不同频率的正弦信号构成,它们的频率分别为[32,50,54,56,59,83],幅值为[10,10,20,20,30,20],初始相角均为0。设法通过经典的复调制细化FFT的方法分离出50~59Hz间的频率成分。程序如下:

clear all; clc; close all;

N=640;                       % 数据长度 
fs=200;                      % 采样频率
t=(0:N-1)/fs;                % 时间刻度
% 构成信号序列
x=10*sin(2*pi*32*t)+10*sin(2*pi*50*t)+20*sin(2*pi*54*t)+...
    20*sin(2*pi*56*t)+30*sin(2*pi*59*t)+20*sin(2*pi*83*t);

nfft=64;                     % FFT长度
X=fft(x,nfft);               % FFT分析
ff=(0:(nfft/2-1))*fs/nfft;   % 频率刻度
n2=1:nfft/2;                 % 正频率索引号
X_abs=abs(X(n2))*2/nfft;     % 正频率部分的幅值谱
fe=55;                       % 中心频率
D=10;                        % 细化倍数
[y,freq]=exzfft_ma(x,fe,fs,nfft,D);  % 细化分析
% 作图
figure(1)
subplot 311; plot(t,x,'k');
xlabel('时间/s'); ylabel('幅值');
xlim([0 1]); title('时间序列');
subplot 312; plot(ff,X_abs,'k');
xlabel('频率/Hz'); ylabel('幅值');
title('细化分析前频谱'); grid;
subplot 313; plot(freq,abs(y),'k'); grid;
set(gca, 'XTickMode', 'manual', 'XTick', [50,54,56,59]);
set(gca, 'YTickMode', 'manual', 'YTick', [10,20,30]);
xlabel('频率/Hz'); ylabel('幅值');
title('细化分析的频谱');
set(gcf,'color','w');
figure(2)
plot(ff,X_abs,'k--');  hold on
xlabel('频率/Hz'); ylabel('幅值');
plot(freq,abs(y),'k'); grid; ylim([0 32]);
legend('细化分析前的频谱','细化分析的频','location','northwest');
title('细化分析前的频谱与细化分析频谱的对照');
set(gca, 'XTickMode', 'manual', 'XTick', [32,50,54,56,59,83]);
set(gca, 'YTickMode', 'manual', 'YTick', [10,20,30]);
set(gcf,'color','w');

运行结果如下:

细化FFT(Zoom—FFT)_第2张图片
 

细化FFT(Zoom—FFT)_第3张图片 

运行程序后得上图。在图1中画出了细化分析前FFT的结果,可以看到50~59Hz的4条谱线重合在一起,区分不了;而细化分析后4条谱线清晰可见。

参考文献:MATLAB数字信号处理85个实用案例精讲——入门到进阶;宋知用(编著)

你可能感兴趣的:(matlab,开发语言)