【20211214】【信号处理】使⽤Matlab求解信号的频谱图、
幅度谱、相位谱
⼀、背景知识
1. 频谱
信号的频谱由两部分组成:幅度谱和相位谱。
2. 幅度谱
在傅⾥叶分析中,把各个分量的幅度随频率的变化称为信号的幅度谱。
补充幅度谱的求解⽅法:
(1)如果不是直流分量的频率,即 f≠0Hz,则幅度谱 = 频谱幅度 / (N/2) ;
(2)对于直流分量,即 f=0Hz,则幅度谱 = 频谱幅度 / N ;
(参考:)
(参考:)
3. 相位谱
在傅⾥叶分析中,把各个分量的相位随频率的变化称为信号的相位谱。
(参考:)
(参考:)
⼆、举个栗⼦~
%
clear; clc; close all; warning off;
fs = 1000; % 采样频率
t = 0 : 1/fs : 10;
datalength = length(t);
s1 = 10 * sin(2 * pi * 50 * t); % 信号1
s2 = 3 * sin(2 * pi * 100 * t); % 信号2
s3 = 15 * cos(2 * pi * 30 * t); % 信号3
s4 = 1 * randn(1, datalength); % 信号4(⾼斯⽩噪声)
s = s1 + s2 + s3 + s4; % 合成信号
% FFT
N = 1024; % FFT点数
sFFT = fft(s, N); % N点傅⾥叶变换
sFFTPow = abs(sFFT) .^ 2; % 功率(功率信号的傅⾥叶变换是功率谱)sFFTPowdB = pow2db(sFFTPow(1:N/2)); % 功率转db
% 原始信号波形和频谱图
figure;
sp1 = subplot(3, 1, 1);
plot(s1, 'linewidth', 1.5); hold on;
matlab求傅里叶变换plot(s2, 'linewidth', 1.5); hold on;
plot(s3, 'linewidth', 1.5); hold on;
plot(s4, 'linewidth', 1.5); hold off;
legend('s1', 's2', 's3', 's4');
title('分解信号'); axis('tight');
sp2 = subplot(3, 1, 2);
plot(s, 'linewidth', 1.5);
title('合成信号'); axis('tight');
sp3 = subplot(3, 1, 3);
plot(sFFTPowdB, 'linewidth', 1.5);
title('信号s的傅⾥叶变换(只画正频部分)'); axis('tight');
linkaxes([sp1, sp2], 'x');
% 幅度谱和相位谱
magnitude = abs(sFFT); % 幅度谱
phase = angle(sFFT); % 相位谱(rad)
figure;
sp1 = subplot(2, 1, 1);
plot(magnitude, 'linewidth', 1.5);
title('幅度谱'); axis('tight');
sp2 = subplot(2, 1, 2);
plot(phase, 'linewidth', 1.5);
title('相位谱'); axis('tight');
linkaxes([sp1, sp2], 'x');
运⾏结果:
将图⼀局部放⼤:
观察运⾏结果注意到:幅度谱有三个尖峰,对应于傅⾥叶变换之前的三个单频正弦信号,但幅度谱的三个幅值均不等于傅⾥叶变换之前的信号幅值。
但除以傅⾥叶变换点数 N 之后的幅度谱三个尖峰幅值 = 原信号幅值的⼀半(这⼀点我还不是特别明⽩为什么要除以 N,为什么为原信号幅值的⼀半,有可能得到的是双边谱,如果只显⽰正频部分,乘以 2 之后就和原信号幅值⼀致了~)(解释见上⾯补充的幅度谱求解⽅法),相位谱也可以由 rad 转为 °,代码如下:
% 幅度谱和相位谱
magnitude = abs(sFFT) ./ N; % 幅度谱
phase = angle(sFFT) * 180 / pi; % 相位谱(rad)
(参考:)
(参考:)
运⾏结果如下图:
(参考:)
(参考:)
(参考:)
(参考:)
三、知识点
1. 能量信号和功率信号
(1)能量有限,功率为零的信号为能量信号;(例如单⼀脉冲信号、单⼀⽅波等)
(2)能量⽆限,功率有限的信号为功率信号;(例如⽆限延伸的正弦信号、⽆限延伸的⾼斯⽩噪声,所以本⽂中的合成信号 s 为功率信号,其频谱为功率谱)
所有周期信号都是功率信号(因为能量⽆限),所有有限数量的脉冲信号都是能量信号(因为能量有限)。
(参考:)
(参考:)
2. Matlab 中 angle 和 phase 的区别
angle 和 phase 处理单个标量数据时没有任何差别,都是⽤ atan是函数求相位。但是对于向量和矩阵,angle 函数是对每个数据独⽴求相位⾓度,⽽ phase 会对输出结果做判断,如果相邻两个输出⾓度之差的绝对值超过 3.5,那么 phase 函数会对其重新处理,保证输出的相邻两个相位⾓度差值的绝对值不会超过 3.5。(有点类似于相位解缠绕的意思~)
下图从上到下,是⽹上某例 angle, phase, unwrap 函数的运⾏结果对⽐,可以看出 phase 和 unwrap 的效果特别相似!
(参考:)
(参考:)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论