信号傅里叶变换后频谱刻度设置问题-附Matlab代码

一、概述

时域信号经FFT变换后得到了频谱,在绘制频谱图时还必须设置正确的频率刻度,这样才能从图中得到正确的结果。

二、实例分析

有一余弦信号,信号频率为30Hz,采样频率128Hz,信号长128,原始信号如下图所示:
Matlab代码如下:

fs=128;                         % 采样频率
N=128;                          % 信号长度
t=(0:N-1)/fs;                   % 时间序列
y=cos(2*pi*30*t);               % 余弦信号
figure,plot(y,'r'); xlabel('样点'); ylabel('幅值');

在这里插入图片描述

图1 原始信号

如果不对频谱刻度进行处理,而直接作图显示频谱,那么得到的频谱值会有所偏差,如下图所示:可知信号频谱为30Hz,而实际求出的频谱为31Hz,发生这种错误的原因是频率刻度的设置错误。

y=fft(y,N);                     % FFT
figure,stem(abs(y),'r');title('频谱')

在这里插入图片描述

图2 频谱图

三、频谱刻度设置方法

信号长为N,采样频率为fs,在DFT(FFT)以后信号的频率在-fs/2和fs/2之间,谱线之间的频率间隔为:

Δ f = f s N = 1 N T s \Delta f=\frac{{{f}_{s}}}{N}=\frac{1}{N{{T}_{s}}} Δf=Nfs=NTs1

式中: T s {{T}_{s}} Ts是采样周期。频率刻度从0开始,最大频率为 f s 2 \frac{{{f}_{s}}}{2} 2fs。因此,频谱刻度简单设置如下式所示:

f r e q = ( 0 : N − 1 ) × f s N freq=(0:N-1)\times \frac{{{f}_{s}}}{N} freq=(0:N1)×Nfs

给出的频率刻度为0,△f,···, f s 2 \frac{{{f}_{s}}}{2} 2fs,fs-△f,但实际不存在大于 f s 2 \frac{{{f}_{s}}}{2} 2fs的频率分量,大于 f s 2 \frac{{{f}_{s}}}{2} 2fs的频率分量实际是负频率的分量。如图3所示。

为了给出从负频率到正频率的全部分量,频率刻度应为

f r e q = ( 0 : N − 1 ) × f s N − f s 2 freq=(0:N-1)\times \frac{{{f}_{s}}}{N}-\frac{{{f}_{s}}}{2} freq=(0:N1)×Nfs2fs

这样给出的频率刻度是: − f s 2 − f s 2 + Δ f , ⋅ ⋅ ⋅ , 0 , Δ f , ⋅ ⋅ ⋅ , f s 2 − Δ f -\frac{{{f}_{s}}}{2}-\frac{{{f}_{s}}}{2}+\Delta f,\centerdot \centerdot \centerdot ,0,\Delta f,\centerdot \centerdot \centerdot ,\frac{{{f}_{s}}}{2}-\Delta f 2fs2fs+Δf,,0,Δf,,2fsΔf

在这里插入图片描述

图3 正负频率对比

3.1 正负频谱刻度设置

按照上述理论的设置,对应的matlab代码如下式所示:

%% 频谱显示1(正负频谱都显示)
freq0=(0:N-1)*fs/N;              % 频率间隔
figure,plot(freq0,abs(y),'r')    % 频谱

在这里插入图片描述

图4 频谱刻度设置(正负频率同时显示)

3.2 正频谱刻度设置

也可以通过上式只显示正频率:对应的Matlab代码如下:

%% 频谱显示2(正频谱)
freq=(0:N/2)*fs/N;              % 设置正频率刻度 
figure,plot(freq,abs(y(1:N/2+1)),'r');title('只有正频率刻度')
figure,stem(freq,abs(y(1:N/2+1)),'r');title(' 只有正频率刻度')

在这里插入图片描述

图5 频谱刻度设置(正频率)

3.3 通过linspace函数设置频率刻度(正、负频率都显示)

也可以通过linspace函数设置频率刻度,对应Matlab代码如下:

freq3=linspace(0,fs,N+1)-fs/2;     % linspace 函数设置正负频率
freq3=freq3(1:N);
figure,plot(freq3,abs(y),'r')    % 频谱

在这里插入图片描述

图6 频谱刻度设置(正负频率同时显示)

3.4 通过linspace函数设置频率刻度(正频率)

或者通过linspace函数设置频率刻度显示正频率

%% 通过linspace函数设置频率刻度(正频率)
freq4=linspace(0,fs/2,N/2+1);     % linspace 函数设置正负频率
figure,stem(freq4,abs(y(1:N/2+1)),'r');title('正频率刻度')

在这里插入图片描述

图7 频谱刻度设置(正频率)

四、Matlab程序获取与验证

代码也可从以下链接处获取:

频谱图中频率刻度设置

可开展针对性验证实验,请私信博主。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研中心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值