【信号转换】基于格拉姆矩阵(GASF/GADF)的一维信号转换图像算法【附MATLAB代码】

文章来源:微信公众号:EW Frontier

一.基于GAF的一维信号转换图像算法

1.1基本概念

GAF是利用坐标变化和格拉姆矩阵,实现将时间序列变化成为二维图像的 一种图像编码技术。GAF是采用极坐标系表示时间矩阵的,再用格拉姆矩阵对

生成的角度进行变换,这主要是因为格拉姆矩阵能够保持时间的依赖性,但是 并不能很好的区分有价值信息和高斯噪声,所以要先进行一次空间转换,最常 用的便是将笛卡尔坐标系转换成为极坐标系。

笛卡尔坐标系包括直角坐标系和斜角坐标系,两条数轴相交于原点,构成 了平面仿射坐标系,而且两数轴的度量单位一致。当两坐标轴垂直的时候就被 称为直角坐标系,否则就是斜角坐标系。提取的加速度数据一般都为二维直角 坐标系下的数据,每一个点的位置都由两个数字决定。而极坐标系也属于二维 坐标系,是指在平面取一点作为极点,并引出一个轴作为极轴,并确定单位长度与角度的正方向(一般取逆时针为正)。极坐标上的点位置都是由距离原点的距离以及和极轴的角度表示。因此笛卡尔坐标系的点可以与极坐标一一对应。

格拉姆矩阵可以计算一组向量的线性相关关系,常用于线性代数和几何中。一组n个向量的格拉姆矩阵是由一对对向量的点积组成的矩阵,如式(1)所示:

如果向量u和v的范数都为1,那么两个向量的点积可以改写为:

由此可知,如果处理的是单位向量,那么它们之间的点积只由角度所决定,这个角度可以用弧度表示,且计算出来的值将在-1和1之间。假设处理都是单 位向量,那么格拉姆矩阵将变为式(3):

式中,θi,j为两个向量之间的夹角。

1.2实现方法

斜拉索的加速度响应是典型的一维时间序列,通常在直角坐标系下,其横轴表示时间,纵坐标则代表了每一个时间点所对应的加速度的大小,单位是m/s2。

通过GAF将加速度响应转换为图形数据,实现过程如下:

步骤一,假定传感器采集加速度数据为X={x1,x2,x3,……,xn-1,xn},首 先通过式(4)进行归一化处理,并且将其缩放到[-1,1]之间。

步骤二,将步骤一中缩放后的加速度时间序列转换成为极坐标。主要注意 两个变量:加速度的值及其对应的时间戳。这两个变量可以分别用极坐标的角 度和半径来表示。在极坐标上进行编码,将缩放之后的加速度值用角余弦进行编码,值在[0,π]之间。将其对应的时间戳编码成为半径,公式如下所示:

式中,it—— i x对应的时间戳;M——归一化因子。

将区间[0,1]分成若干份,然后将0舍弃把剩余的点与时间序列数据关联起来,并且让每一个点都落到极坐标中的一个单位圆之中。当时间增加时,加速度时间序列也会以不同的角度和半径在这个单位圆之内不断的扭曲,如图1所示:

图1极坐标编码示意图

这样编码的优异性体现在:①整个编码都是双射的,即给定一段时间序列, 通过此种方式进行编码,得到的在极坐标下的结果将是唯一的。②极坐标相较 于直角坐标系,保持了绝对的时间相关性,不同间隔的时间序列经过重新缩放 并转化为极坐标,也会包含着不同的角度界限,这也为加速度一维时间序列在 转化成二维图像数据时提供了不同的信息粒度。

步骤三,加速度时间序列经过步骤二的极坐标变换,使其也蕴含了时间信

息,因此可以利用GAF对加速度时间序列进行重构。基于不同的算式可以生成 两种不同的图像,分别是格拉姆角和场(GASF)和格拉姆角差场(GADF),其表达 式分别为式(6)和式(7)。

由两个公式可知,随着时间的增加,编码的位置从矩阵的左上角一直运动

到右下角,所以时间维度就通过GAF编码到了矩阵的几何结构当中去。为了进 一步解释GAF编码过程,以图4-2为例进行说明。在加速度时间序列的波形中存在着三个较为明显的波峰,其中第一个波峰要小于后两者。在转化后的二维图像中,同样出现了三个交叉特征,波峰较小的颜色也更浅,从左上角到右下角与加速度时程波形一一对应,说明经过GAF编码技术转化后,二维图像中的相应位置处以点、线、颜色等不同的特征形式对加速度时间序列进行了完整映 射。

图2 GAF映射说明

二.MATLAB代码

本代码需要各位自行设置输入信号a,带入下列程序即可运行,本文的GASF与GDSF图像是利用BPSK调制信号生成。

load BPSK_SNR=0dB.mat% load BPSK_SNR=0dB.mati=1a=squeeze(data(i,1,:))+squeeze(data(i,2,:))*1j; %% GASF  GADF%% 生成数据​X = real(a');X = (X - min(X)) / (max(X) - min(X));m = length(X); %% 数据处理% 将数据归一化[1,-1]X = ((X - max(X)) + (X - min(X)))/(max(X) + min(X)); % 求极坐标fai = acos(X);% 生成GASF = X' * X - sqrt(1 - X.^2)' * sqrt(1 - X.^2);GADF = sqrt(1-X.^2)' * X + X' * sqrt(1 - X.^2);%% 显示图(热力图)% im_1 = figure(1);imagesc(GASF)title('GASF')% saveas(im_1, 'GASF_2.bmp');% im_2 = figure(2);imagesc(GADF)title('GADF');% saveas(im_2, 'GADF_2.bmp');

三.仿真结果

### 解析 Import Error 的常见原因 当遇到 `ImportError: cannot import name 'Generic'` 错误时,通常意味着尝试从模块中导入的对象不存在或无法访问。此问题可能由多种因素引起: - 版本不兼容:不同库之间的版本冲突可能导致此类错误。 - 安装缺失:目标库未正确安装或路径配置有误。 - 导入语句不当:可能存在循环依赖或其他语法层面的问题。 ### 针对 Generic 类型的具体解决方案 对于特定于 `Generic` 的情况,考虑到 Python 中 `Generic` 是 typing 模块的一部分,在处理该类别的 ImportError 时可采取如下措施[^1]: #### 方法一:确认typing模块可用性 确保环境中已安装标准库中的 typing 模块,并且其版本支持所使用的特性。可以通过以下命令验证: ```bash python -c "from typing import Generic; print(Generic)" ``` 如果上述命令执行失败,则可能是由于 Python 或者相关扩展包的版本过低造成的。此时应考虑升级至更高版本的解释器以及对应的开发工具链。 #### 方法二:调整导入方式 有时直接通过顶层命名空间来获取所需组件会更稳定可靠。修改代码以采用这种做法可能会解决问题: ```python from collections.abc import Iterable # 如果是迭代器相关接口 from typing import TypeVar, Protocol # 对于协议和泛型定义 T = TypeVar('T') class MyContainer(Protocol[T]): ... ``` 注意这里并没有显式提到 `Generic` ,而是利用了更为基础的数据结构抽象基类或是其他替代方案实现相同功能[^2]。 #### 方法三:排查环境变量设置 检查系统的 PYTHONPATH 和虚拟环境配置是否正常工作。任何异常都可能导致某些第三方软件包找不到必要的资源文件而引发类似的错误提示。建议清理并重建项目专属的工作区以便排除干扰项的影响。 #### 示例修正后的代码片段 假设原始代码试图这样引入 `Generic` : ```python from some_module import Generic # 可能导致 ImportError ``` 改为遵循官方文档推荐的方式后变为: ```python from typing import Generic # 正确的做法 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值