Matlab 频谱图中如何设置频率刻度

Matlab 频谱图中如何设置频率刻度(横坐标)

1、概述

时域信号经FFT 变换后得到了频谱,在作图时还必须设置正确的频率刻度,这样才能从图中得到正确的结果。下面来介绍如何设置正确的频率刻度。

2、案例分析

有一个余弦信号,信号频率为30Hz,采样频率为100Hz,信号长128,在FFT后做频谱图。

Matlab 复制代码
clear; clc; close all;

fs=128;                         % 采样频率
N=128;                          % 信号长度
t=(0:N-1)/fs;                   % 时间序列
x=cos(2*pi*30*t);               % 余弦信号
y=fft(x,N);                     % FFT

f = linspace(0,64,64); % 设置频率刻度 
stem(f,abs(y(1:64)),'k'); % 作图
xlim([25 35]);
xlabel('频率(Hz)'); ylabel('幅值');
title('(a)幅频曲线');

频谱分析后,最大值谱线应该在 30Hz 处。从图中可以看出,最大值谱线在 30Hz 和 31Hz 之间,这表明信号不是 30Hz 的余弦信号,其频率在 30Hz 与 31Hz 之间,这明显不符合初始设置。发生这种错误的原因是在频率刻度的设置错误。

3、解决方法

当N 为偶数和 N为奇数时,频率刻度的设置方法稍有不同,如下图所示:

(1)当 N 为偶数时,频率刻度设置方法一

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

式中: 是采样周期。频率刻度从0开始,最大频率为 。频率刻度简单设置如图2-2-2(a)所示。

Matlab 复制代码
clear; clc; close all;

fs=128;                         % 采样频率
N=128;                          % 信号长度
t=(0:N-1)/fs;                   % 时间序列
x=cos(2*pi*30*t);               % 余弦信号
y=fft(x,N);                     % FFT

% f = linspace(0,64,64); % 设置频率刻度 
% stem(f,abs(y(1:64)),'k'); % 作图
% xlim([25 35]);
% xlabel('频率(Hz)'); ylabel('幅值');
% title('(a)幅频曲线');

figure('Name','正确的频率刻度')
freq=(0:N/2)*fs/N;              % 按式(2-2-6c)设置正频率刻度 
% 作图
stem(freq,abs(y(1:N/2+1)),'k')
xlabel('频率(Hz)'); ylabel('幅值');
title('(b) 只有正频率刻度')
xlim([25 35]);
set(gcf,'color','w');

由图可知,图中频率刻度,只用了正频率来表示,最大值的谱线在 30Hz 处,与信号设置频率一致。

相关推荐
Tiandaren30 分钟前
Selenium 4 教程:自动化 WebDriver 管理与 Cookie 提取 || 用于解决chromedriver版本不匹配问题
selenium·测试工具·算法·自动化
nbsaas-boot2 小时前
Java 正则表达式白皮书:语法详解、工程实践与常用表达式库
开发语言·python·mysql
岁忧2 小时前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go
chao_7892 小时前
二分查找篇——搜索旋转排序数组【LeetCode】两次二分查找
开发语言·数据结构·python·算法·leetcode
风无雨2 小时前
GO 启动 简单服务
开发语言·后端·golang
斯普信专业组2 小时前
Go语言包管理完全指南:从基础到最佳实践
开发语言·后端·golang
秋说4 小时前
【PTA数据结构 | C语言版】一元多项式求导
c语言·数据结构·算法
Maybyy4 小时前
力扣61.旋转链表
算法·leetcode·链表
我是苏苏4 小时前
C#基础:Winform桌面开发中窗体之间的数据传递
开发语言·c#
斐波娜娜4 小时前
Maven详解
java·开发语言·maven