在频谱分析过程中经常会遇到密集频谱的现象,就是许多谱线集中在某个区域中难以区分。要解决密集频谱问题最好的方法是细化谱分析,又称为频谱细化分析方法。频谱细化分析方法都是在复调制下进行的,即把信号复调制移频,使要了解的那段频带谱移到零频附近,再进行傅里叶分析。一般称为Zoom-FFT(ZFFT)方法,即细化FFT方法。
经典的复调制频谱细化分析方法
经典的复调制频谱细化FFT步骤为:复调制移频→低通数字滤波→重采样→FFT及谱分析→频率调整。其原理过程如下图所示。
经典复调制频谱细化分析的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');
运行结果如下:
运行程序后得上图。在图1中画出了细化分析前FFT的结果,可以看到50~59Hz的4条谱线重合在一起,区分不了;而细化分析后4条谱线清晰可见。
参考文献:MATLAB数字信号处理85个实用案例精讲——入门到进阶;宋知用(编著)