单频信号的相位谱计算与误差修正-附Matlab代码
一、问题描述
我们在实际处理时经常遇到只有一个正弦信号的情况,其频率为 f 0 {{f}_{0}} f0,在谱分析以后,除了在频率为 f 0 {{f}_{0}} f0处有相位数值外,其他频率处都有相位数值,分析其他频谱出现相位值的原因。
例如,假设信号采样率为1000Hz,有一个余弦信号,其频率为f0=50Hz,幅值都为1,初始相角为pi/3=1.0472,信号长度为1000,该信号如下图所示:
对应Matlab代码如下:
fs=1000; % 采样频率
f0=50; % 信号频率
A=1; % 信号幅值
theta0=pi/3; % 信号初始相角
N=1000; % 信号长度
t=(0:N-1)/fs; % 设置时间序列
x=A*cos(2*pi*f0*t+theta0); % 设置信号
figure,plot(x,'r')
xlabel('样点'); ylabel('幅值'); title('原始信号')
图1 原始信号
此时,对上述信号进行傅里叶变换,并获取其频谱图,如下图所示。从幅值谱图上可知,明显可看到在50Hz处有一个峰值,其他频率幅值都为0。
对应的Matlab代码如下所示:
X=fft(x); % FFT
n2=1:N/2+1; % 设置索引号序列
freq=(n2-1)*fs/N; % 设置频率刻度
figure,plot(freq,abs(X(n2))*2/N,'r');title('幅值谱图-正频率');xlabel('频率/Hz'); ylabel('幅值')
图2 频谱图
绘制该信号的相位谱,如下图所示,可知该相位谱非常乱,除了50Hz频率外的其他频率都有一个初始相位。
THETA=angle(X(n2)); % 计算初始相角
Am=abs(X(n2)); % 计算幅值
ph0=THETA(51); % 计算信号的初始相角
figure,plot(freq,THETA,'r')
xlabel('频率/Hz'); ylabel('初始角/弧度');title('相位谱图-正频率部分')
图3 相位谱图
二、原因分析
首先计算50Hz和其他频谱线的实部和虚部,以及各自的初始相位值。如下图所示:
可以发现,在50Hz频率出,计算的初相为1.0472与设置的初相角一致,然而,在频率为非50Hz以外,如1Hz等,它们的实部和虚部的值都是 10 − 14 ∼ 10 − 13 {{10}^{-14}}\sim {{10}^{-13}} 10−14∼10−13量级,这是由计算误差生的,使用反三角函数后就能得到相应的初始相位数值,分布在-pi和pi之间,造成了相位值的混乱。而其他频率分量也差不多是这样的量级。
三、解决方法
要消除这种相角初始值的混乱,可在程序中设置一个阈值Th。在本例中有用的频率分量只有50Hz一条谱线,阈值比较容易选择;若频谱中有用的频率分量有多条谱线,则可以寻找有用的频率分量中的最小幅值Amin,而要把阈值Th设置成Th<Amin。
Matlab如下:
Th=0.1; % 设置阈值
thetadex=find(Am<Th); % 寻找小于阈值的那线谱线的索引
THETA1=THETA; % 初始化THETA1
THETA1(thetadex)=0; % 对于小于阈值的那线谱线初始相位都为0
figure,plot(freq,THETA1,'r')
xlabel('频率/Hz'); ylabel('初始角/弧度');title('相位谱图-正频率部分')
图5 修正后的相位谱图
此时相位谱图中不在出现混乱的初始相位值,只有50Hz处有一个初始相位角值,结果为1.0472。
四、Matlab程序获取与验证
Matlab链接如下:
单频信号的相位谱计算与误差修正
可开展针对性验证实验,请私信博主。
博主简介:研究方向涉及智能图像处理、深度学习、卷积神经网络等领域,先后发表过多篇SCI论文,在科研方面经验丰富。任何与算法、程序、科研方面的问题,均可私信交流讨论。
单频信号的相位谱计算与误差修正-附Matlab代码相关推荐
- 利用对位相乘法计算线性卷积-附Matlab代码
目录 1.线性卷积原理 2.利用对位相乘法计算线性卷积 3.Matlab实操 3.1源代码 3.2仿真结果 线性卷积原理 公示(1)为两个离散非周期序列进行线性卷积 一般我们计算线性卷积时使用图解法最 ...
- 谱本征正交分解 (SPOD)附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
- 对于单频信号出现频谱泄露的解决办法——整周期采样
什么是整周期采样? 假设正弦信号的频率f0是△f的整数倍,即有f0=a△f,a是整数,满足这一条件采得的数据称为整周期采样.把这一条件再进一步展开,可得 f0/(fs/N)=a 这说明在已知采样频率f ...
- SAR成像系列:【3】合成孔径雷达(SAR)的二维回波信号与简单距离多普勒(RD)算法 (附matlab代码)
合成孔径雷达发射信号以线性调频信号(LFM)为基础,目前大部分合成孔径雷达都是LFM体制,为了减轻雷达重量也采用线性调频连续波(FMCW)体制:为了获得大带宽亦采用线性调频步进频(FMSF)体制. ( ...
- 几种常用信号平滑去噪的方法(附Matlab代码)
几种常用信号平滑去噪的方法(附Matlab代码) 1 滑动平均法 1.0 移动平均法的方法原理 1.1 matlab内自带函数实现移动平均法 1.2 利用卷积函数conv()实现移动平均法 1.3 利 ...
- 情感识别:基于ELM、SOM分类器实现心率变异性信号情感识别,附matlab代码
情感识别:基于ELM.SOM分类器实现心率变异性信号情感识别,附matlab代码 情感识别是一项有趣而又具有挑战性的任务.它可以用于识别人类的情绪状态,从而在许多领域中产生影响,例如医疗保健.人工智能 ...
- 信号去噪,基于Sage-Husa自适应卡尔曼滤波器实现海浪磁场噪声抑制及海浪磁场噪声的产生附Matlab代码
信号去噪,基于Sage-Husa自适应卡尔曼滤波器实现海浪磁场噪声抑制及海浪磁场噪声的产生附Matlab代码 信号处理中的一个关键问题就是信号去噪.在实际应用中,很多信号可能会受到环境噪声的干扰,这些 ...
- 信号相角位移量的计算与信号位移计算-附Matlab代码
一.初始相角的位移量 在信号处理中正弦信号经常表示为 x ( n ) = A cos ( 2 π f 0 n / f s + θ ) x\left( n \right)=A\cos (2\pi { ...
- 【信号分解】基于LMD算法和ELMD算法实现管道泄漏信号处理附matlab代码
1 内容介绍 在科技水平相当发达的今天,互联网+.大数据慢慢渗透进人们的生活当中,但 科技的进步不仅仅要体现在生活质量水平的提高.经济的快速发展,更应该体现在对社会资源的合理利用.自建国以来,我国管道 ...
最新文章
- 一个高并发请求的算法
- Conan and Agasa play a Card Game codeforce
- STM32F系列USART的IDLE中断要注意了
- spring知识概要
- 【机器学习入门】图解超经典的KNN算法
- 2018 中国服务创新大会 | 早鸟票正式开售
- 利用python爬虫(案例6+part14)--如何爬取科研数据
- java实现遍历树形菜单方法——OpenSessionView实现
- python中文词云图代码_Python简单实现词云图代码及步骤解析
- 【OpenCV 例程200篇】42. 图像的灰度变换(比特平面分层)
- 流和流库[给初学者非常有用]
- 在Git中找到破坏测试的提交
- 打算_20160604
- Oracle Database 11g 下载
- 人教版四年级上次计算机教案,人教版四年级上册数学教案
- 渗透测试工程师面试题
- Scratch实现打字游戏
- 奶粉中php是什么意思,那种奶粉dha含量高,奶粉中dha是什么意思
- java实现捕鱼达人
- 最新38道JVM面试题,看完读懂轻松收offer,进入大厂非常的easy