【DSP】理解并用MATLAB手动实现unwrap()
文章目录
- unwrap函数详解
- unwarp标准系统函数
- 手动实现unwrap
- 拟一组数据
- 分析拟定数据
- 修订拟定数据 - 解卷绕
- 整理公式
- MATLAB手动实现
- MATLAB代码解释
- MATLAB结果对比
unwrap函数详解
- 一般在计算一个系统相频特性时,就要用到反正切函数提取相位,计算机中反正切函数规定:在一、二象限中的角度为0 ~ π,三、四象限的角度为0 ~ -π
- 但实际得到的结果会发生相位跳变,跳变幅度为2π,这就叫做相位的卷绕
- unwrap的作用就是解卷绕,使相位在π处不发生跳变,从而反映出真实的相位变化
unwarp标准系统函数
- unwrap(pha, tol, dim)
- pha为数列或矩阵
- tol为判断的阈值
- dim可以设置为操作对象
- 若对每一列进行操作,那参数可填1或者省略
- 若对每一行进行操作,那参数需填2
手动实现unwrap
拟一组数据
假设此时我们拥有一组数据:Data = [-59, -92, -126, -158, 166, 133, 96, 61, 26, -7, -18, -59, -92, -126, -158, 166, 133, 96, 61, 26, -7, -18];
如上图所示,这些数据呈现一种类似周期性的循环,但这并不是真的周期函数,只是因为当他的数值跨越 ±π 时,就会根据其变化形式,条编导边界重新计算
这种状态我们一般称之为相位的卷绕或相位的折叠,用wrap表示,则相位饿解卷绕被称为unwrap
分析拟定数据
- 数据本身呈现递减趋势,从-59°开始不断递减
- 数据中在 -158° -> 166° 出现第一次跳变,跳变后继续下降,直到下一次跳变的出现
修订拟定数据 - 解卷绕
- 恢复原本的度数 -158° -> 166°
- -158°到边界点的距离 = |-158° - (-180°)| = 22°
- 边界点到166°的距离 = |180° - 166°| = 14°
- 故整体变化度数 = 22° + 14° = 36°
- 原本度数 = -158° - 36° = -194°
- 观察跳变数据
- 166 - (-194°) = 360°,恰好为360°,从-180°跳到了180°,将函数值增加了360°
- 得出本质
- 根据函数值的变化,wrap的本质就是:当相位超出边界时,补偿360°并继续计算,而unwrap就是为了消除这种补偿
- 后续数据
- 后续数据也应该随着跳变点处恢复原本数据而进行改变,即在遇到下一个跳变点之前,所有数据均应该减去360°得到原始数值
- 在遇到第二个跳变点时,由于进一步的跳变令补偿再次增加了360°,故第二次跳变之后的值到第三次跳变到来之前,所有数据应该在原本基础上修正360°*2 = 720°
整理公式
- 根据上述分析unwrap与wrap的关系可以表达为
unwrap(x)=wrap(x)±360∗wrapNumber(x)unwrap(x) = wrap(x) ± 360 * wrapNumber(x) unwrap(x)=wrap(x)±360∗wrapNumber(x) - 公式中的±分别对应数据递增或递减的情况,将其使用wrapCycle表示,公式可变为
unwrap(x)=wrap(x)−wrapCycle∗wrapNumber(x)unwrap(x) = wrap(x) - wrapCycle * wrapNumber(x) unwrap(x)=wrap(x)−wrapCycle∗wrapNumber(x) - 公式中每个对应的数据点均为其对应一个wrapCycle表示其跳变,公式可变为
unwrap(x)=wrap(x)−wrapCycle(x)∗wrapNumber(x)unwrap(x) = wrap(x) - wrapCycle(x) * wrapNumber(x) unwrap(x)=wrap(x)−wrapCycle(x)∗wrapNumber(x)
MATLAB手动实现
%% unwrap
% unwrap(x) = wrap(x) - wrapCycle*wrapNum(x)% data0
Data = [-59, -92, -126, -158, 166, 133, 96, 61, 26, -7, -18, -59, -92, -126, -158, 166, 133, 96, 61, 26, -7, -18];
subplot(3, 1, 1);
plot(1:length(Data), Data);
title('Ram simulated data')
grid on;% use system function unwrap
unwrap_Data = unwrap(deg2rad(Data), [], 2);
unwrap_finallyData = rad2deg(unwrap_Data);
subplot(3, 1, 2);
plot(1:length(Data), unwrap_finallyData);
title('Use system function unwrap')
grid on;% try to simulate unwrap
length_Data = length(Data);
finallyData = [];
CycleNumber = [];
wrapCycle = [];
% calculata CycleNum
for i = 1 : length_Dataif i > 1if (Data(i) - Data(i-1)) > 180 CycleNumber(i)= CycleNumber(i-1) + 1;elseif (Data(i) - Data(i-1)) < -180CycleNumber(i) = CycleNumber(i-1) + 1;elseCycleNumber(i) = CycleNumber(i-1);endelseCycleNumber(i) = 0;end
end
% calculata wrapCycle
for i = 1 : length_Dataif i > 1if (Data(i) - Data(i-1)) > 180 wrapCycle(i)= 360;elseif (Data(i) - Data(i-1)) < -180wrapCycle(i) = -360;elsewrapCycle(i) = wrapCycle(i-1);endelsewrapCycle(i) = 0;end
end
% updata Data
for i = 1 : length_DatafinallyData(i) = Data(i) - wrapCycle(i)*CycleNumber(i);
end
subplot(3, 1, 3);
plot(1:length(Data), finallyData);
title('try to simulate unwrap')
grid on;
MATLAB代码解释
- % data0
- 拟定一组含有跳变的数据值,并将其进行绘制,作为对比
- % use system function unwrap
- 使用系统标准unwrap函数进行解卷绕
- 由于拟定数据表示角度,故在调用unwrap()函数需要对数据进行deg2rad角度到弧度的转换
- 使用unwrap()解卷绕之后,为方便对比,对数据进行rad2deg弧度到角度的转换
- 进行绘制作为对比
- % try to simulate unwrap
- 手动实现unwrap
- % calculata CycleNum
- 第一个数据跳变次数为0
- 之后所有的数据是否跳变取决于与前一个数据的差值是否超过180°
- 当跳变出现,说明针对前序数据发生一次跳变,即新跳变数据的跳变数比前一次跳变的跳变数多一
- % calculata wrapCycle
- 第一个数据的跳变大小为0
- 之后所有的数据跳变大小取决于与前一个数据的差值是否超过180°
- 若差值在[-180, 180],跳变大小与前序数据跳变大小相等
- 若差值 > 180, 跳变大小为360°进行解卷绕
- 若差值 < -180, 跳变大小为-360°进行解卷绕
- % updata Data
- 更新手动实现的unwrap数据结果
- 进行绘制作为对比
MATLAB结果对比
- 数据对比
- 图像对比
【DSP】理解并用MATLAB手动实现unwrap()相关推荐
- 【数据结构与算法】详解什么是图结构,并用代码手动实现一个图结构
本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...
- matlab 与dsp联合仿真,matlab和DSP联合开发前景很大?
呵呵,俺也是MATLAB的爱好者,看侬找得这么辛苦给侬发过俺刚买的书的目录吧,希望对侬有用!!! 目录 第1章 MATLAB基础 1.1 MATLAB开发环境新功能 1.1.1 函数浏览器 1. ...
- dsp 正弦波信号发生器matlab程序,基于Matlab/DSP Builder多波形信号发生器的设计
在Simulink中进行的仿真是属于系统验证性质的,是对MDL文件进行的仿真,并没有对生成的VHDL代码进行过仿真.事实上,生成VHDL描述的是 RTL级的,是针对具体的硬件结构的,而在Matlab的 ...
- 矩阵条件数的定义、理解以及matlab代码
目录 1.矩阵条件数的定义 1.1 矩阵范数的定义 1.2 矩阵范数举例 2 矩阵条件数的意义 3.矩阵条件数matlab代码 1.矩阵条件数的定义 cond ( A ) = ∥ A ∥ ∙ ∥ ...
- DWA算法理解及其MATLAB实现
原请看https://blog.csdn.net/gophae/article/details/105299926 ****************************************** ...
- MATLAB手动修改神经网络权值的方法
文章目录 一.问题描述 二.解决方法 三.简单的测试 一.问题描述 我在MATLAB上用deepNetworkDesigner做了一个简单的网络: 现在我想手动修改网络的权值矩阵. 网络的存储格式如下 ...
- OFDM理解与matlab代码
1.相关概念 基带.信息源,也称发射端,发出的没有经过调制(进行频谱搬移和变换)的原始电信号所固有的频带(频率带宽). 频带.对基带信号调制后所占用的频率带宽. 带宽.一个信号所占有的从最低的频率 ...
- vivado----fpga硬件调试 (七)----数据导出并用MATLAB读取
Vivado套件中的Debugger(类似ISE套件中的ChipScope)提供了在本地窗口中查看硬件实时数据的途径,但是无法导出类似ChipScope中的.prn这种文本数据格式,只能通过write ...
- C语言实现离散余弦变换(DCT)并用MATLAB和Python验证
概念 离散余弦变换(Discrete Cosine Transform,DCT)是可分离的变换,其变换核为余弦函数.是与傅里叶变换相关的一种变换,它相当于把离散傅里叶变换的虚数部分丢掉,只使用实数.D ...
最新文章
- 分析 | MEMS传感器市场报告
- android:src= @drawable/login_logo,android实现登录,Login姿势对不对?
- DVWA-暴力破解-对‘g0tmi1k’文章的学习笔记
- npz文件转为npy_numpy的文件存储 .npy .npz 文件
- 3结构介绍_豹驰(BOACH)声学材料吸隔声方法介绍—(下)材料隔声特性曲线
- 15:46 2009-8-2 sql2005客户端装不上,碎片不能整理,createthread
- 10款Flash和Javascript网页音乐播放器
- 如何打造园本特色_如何打造一个可持续发展的特色观光园?
- 突然!华为P30 Pro真机上手视频曝光:屏幕指纹解锁秒开
- Objective-C之@类别小实例
- 好用的 身份证识别OCR API
- 制定项目进度计划的过程
- 【历史上的今天】8 月 31 日:人工智能起源;GPU诞生;Windows 98中文版来了
- 微信小程序中的列表渲染
- VS2012(Visual Studio 2012)官方免费中文旗舰版下载(含激活密钥)
- Linux网络系统之配置域名与主机名映射和常见网络命令
- 如何设计一个可用的web容器
- Unity实现可调子屏幕(类小地图)效果
- 在UE4中创建新的Shading Model
- ps2模拟器bios3dm_呆萌PS2模拟器bios文件下载|呆萌PS2模拟器专业版下载v3.1.2-乐游网安卓下载...