【 1. 补零的原由 】
FFT运算点数M > 采样点数N 时,fft(xn,M) 函数对信号 xn 进行尾补零操作即在该信号尾部添加多个值为0的数据点以使信号总点数N增至FFT运算所需点数M。
【 2. 补零的影响 】
补1次零相当于在原始频谱图中每两个频率之间插入1个频率值,补2次零相当于在原始频谱图中每两个频率之间插入2个频率值,并且原始频率值的位置及其幅值保持不变。因此, 补零会使频谱图中的频率点的数量增加,从而使得频谱图更加的光滑连续,但是补零不能对频谱图中的 频率分辨率、频率值以及幅值有所改善 。 在补零操作中,所补的零值点的数量所占分析信号比例越大,分析结果中的幅度越小。 补零的好处 : ① 使数据N为2的整次幂,便于使用 FFT。 ② 补零后,其实是对DFT结果做了插值,克服“栅栏"效应,使谱外观平滑化。我把“栅栏"效应形象理解为,就像站在栅栏旁边透过栅栏看外面风景,栅栏会挡住比较多风景,此时就可能漏掉较大频域分量,但是补零以后,相当于你站远了,风景就看的越来越清楚了。 ③ 由于对时域数据的截短必然造成频谱泄露,因此在频谱中可能出现难以辨认的谱峰,补零在一定程度上能消除这种现象。头补零和尾补零对分别 FFT 输出结果的影响 对信号进行头补零或尾补零再得到的幅频响应相等,相频响应不同。如下代码及结果所示:
% % [ 预处理]
clc; % 清除命令窗口
clear; % 清除工作空间的变量和函数
clf; % 清除当前图形
% % [ 采样参数]
fs= 6400 ; % 采样频率 ( Hz)
ts= 1 / fs; % 采样周期 ( s)
N= 120 ; % 采样点数 ( 个)
n= 0 : N- 1 ; % 采样点索引
t= n* ts; % 采样时间轴
% % [ 被采信号]
fa= 100 ; % 信号a的频率
fb= 900 ; % 信号b的频率
xn= 2.5 + sin ( 2 * pi* fa* t) + 3 * sin ( 2 * pi* fb* t) ; % 被采信号= 信号a+ 信号b
% % [ 头补零]
xntou= [ zeros ( 1 , 8 ) xn] ;
M= 128 ; % FFT运算点数
X= fft ( xntou, M) ; % FFT输出值
X= [ X ( 1 ) / N, X ( 2 : M) * 2 / N] ; % 幅度轴
X= fftshift ( X) ; % 频域搬移
k= - M/ 2 : M/ 2 - 1 ; % 频率点索引
f= fs* k/ M; % 频率轴
subplot ( 2 , 2 , 1 ) ;
stem ( f, abs ( X) ) ; % 序列图
xlabel ( '频率' ) ; % 横轴坐标
ylabel ( '幅度' ) ; % 纵轴坐标
title ( { '头补零-幅频响应' } ) ;
grid; % 显示表格线
subplot ( 2 , 2 , 2 ) ;
stem ( f, angle ( X) * 180 / pi) ; % 绘制相频响应曲线,注意这将弧度转换成了角度
xlabel ( '频率' ) ; % 横轴坐标
ylabel ( '相位' ) ; % 纵轴坐标
title ( { '头补零-相频响应' } ) ;
grid; % 显示表格线
% % [ 尾补零]
xnwei= [ xn zeros ( 1 , 8 ) ] ;
M= 128 ; % FFT运算点数
X= fft ( xnwei, M) ; % FFT输出值
X= [ X ( 1 ) / N, X ( 2 : M) * 2 / N] ; % 幅度轴
X= fftshift ( X) ; % 频域搬移
k= - M/ 2 : M/ 2 - 1 ; % 频率点索引
f= fs* k/ M; % 频率轴
subplot ( 2 , 2 , 3 ) ;
stem ( f, abs ( X) ) ; % 序列图
xlabel ( '频率' ) ; % 横轴坐标
ylabel ( '幅度' ) ; % 纵轴坐标
title ( { '尾补零-幅频响应' } ) ;
grid; % 显示表格线
subplot ( 2 , 2 , 4 ) ;
stem ( f, angle ( X) * 180 / pi) ; % 绘制相频响应曲线,注意这将弧度转换成了角度
xlabel ( '频率' ) ; % 横轴坐标
ylabel ( '相位' ) ; % 纵轴坐标
title ( { '尾补零-相频响应' } ) ;
grid; % 显示表格线