压缩感知正交匹跟踪算法(OMP)代码实现之一维连续信号的求解

前天,列举对单一向量OMP算法的求解,这个向量是离散的。

但是我们知道自然界中的信号是模拟(连续)信号。学过一些信号系统的同学应该知道,自然界的信号(光信号,声信号)是连续的。

比如下图的信号

在这里插入图片描述
假设要保存上图的信号,我们需要等间隔的采样256次(只是假设,上图可能不需要那么多)。采样256次是奈奎斯特定理规定的最少采样次数,如果低于这个次数,上图就没办法恢复出来了。但是压缩感知却告诉我们,我们可以通过某种方法(测量矩阵)采样,使得采样出来的数据只有64个。这样保存的数据量便从256个下降到64个。这就是压缩感知的迷人之处!!!

这篇代码是在香港大学沙威发布在网上的MATLAB代码的复现。网上我找不到关于OMP算法python3.6的代码,所以试着去复现沙威的代码,一来进一步理解OMP算法,二来可以将这个代码公布出来,方便新手学习。

首先先利用三角函数生成一个信号。如下图所示。
在这里插入图片描述
经过一系列计算我们可以近乎完美的恢复出上图信号。恢复出来的信号如下图所示。在这里插入图片描述
好了,直接上代码。

'''
一维连续向量压缩感知的实现(正交匹配跟踪算法)
测量数M>=K*log(N/K),K是稀疏度,N信号长度,可以近乎完全重构
本篇代码是利用香港大学电子工程系的沙威MATLAB代码进行python3.6的复现
编程时间:2019.7.20
编程人:kyda
'''

import matplotlib.pyplot as plt
import numpy as np
import numpy.linalg as lg
from math import sqrt


def get_matri_new_plus(A):
    '''
    求A矩阵的伪逆
    :param A: 输入矩阵
    :return A_new: 求解的伪逆矩阵
    '''
    A_new = A.T.dot(A)
    if A_new.ndim < 2:
        A_new =  1 / A_new
        A_new = A_new * A.T
    else:
        A_new = lg.inv(A_new)
        A_new = A_new.dot(A.T)
    return A_new

def get_A_ba(A):
    '''
    求解A_ba,也就是矩阵列向量单位化
    :param A: 输入矩阵
    :return A_new: 返回列向量单位后的矩阵
    '''
    A_new = A.T
    for row in range(A_new.shape[0]):
        norm2 = lg.norm(A_new[row], ord=2)           # 求向量的2范数
        A_new[row] /= norm2                          # 单位化
    return A_new


def find_pos_VecInMatrix(A, v):
    '''
    求解某个向量在矩阵中的相应行位置
    :param A: 输入矩阵
    :param v: 输入向量
    :return pos: 位置
    '''
    A_rownum = A.shape[0]    # 矩阵行的数量
    for pos in range(A_rownum):
        if (v==A[pos]).all():           # 判断向量v和矩阵中的某一行是否相等
            return pos

'''
1. 时域测试信号生成
'''

K = 7                                           # 稀疏度
N = 256                                         # 信号长度
M = 64                                          # 测量量
f1 = 50                                         # 信号评率1
f2 = 100                                        # 信号频率2
f3 = 200                                        # 信号频率3
f4 = 400                                        # 信号频率4
fs = 800                                        # 采样频率
ts = 1 / fs                                     # 采样间隔
Ts = np.arange(0, N)                            # 采样序列
op = 2 * np.pi * Ts * ts
x = 0.3*np.cos(op*f1) + 0.6*np.cos(op*f2) + 0.1*np.cos(op*f3) + 0.9*np.cos(op*f4)    # 完整信号

'''
2.时域信号压缩传感
'''
Phi = np.random.randn(M, N)                     # 测量矩阵(高斯分布白噪声)
s = Phi.dot(x)                                  # 获得线性测量


'''
3. 正交匹配跟踪算法重构信号(本质上是L_1范数最优化问题)
'''
m = 2 * K                                       # 算法迭代次数(m>=K)
Psi = np.fft.fft(np.eye(N, N)) / sqrt(N)        # 傅里叶正变换矩阵
T = Phi.dot(Psi.T)                              # 恢复矩阵(测量矩阵*正交反变换矩阵)

hat_y = np.zeros(N)                             # 待重构的谱域(变换域)向量
Aug_t = None                                    # 增量矩阵(初始值为空矩阵)
r_n = s                                         # 残差值

product = [0]*N
T_tran = T.T
A_ba = T_tran.copy()                            # 初始化A矩阵
A_ba1 = A_ba                                    # 复制
pos_selected_v = []
for times in range(m):
    w = A_ba.dot(r_n)                           # 求各列向量和残差的投影系数
    pos = np.argmax(abs(w))                     # 最大投影系数所对应的位置
    b_k = A_ba[pos]
    A_ba = np.delete(A_ba, pos, axis=0)         # 选中的列删除
    pos1 = find_pos_VecInMatrix(A_ba1, b_k)
    pos_selected_v.append(pos1)                 # 纪录最大投影系数的位置
    if Aug_t is None:                          # 将最大贡献向量(未单位化的)加入Aug_t矩阵
        Aug_t = T_tran[pos1]
    else:
        Aug_t = np.c_[Aug_t, T_tran[pos1]]
    A_new_plus = get_matri_new_plus(Aug_t)
    aug_y = A_new_plus.dot(s)                   # 解最小二乘解
    r_n = s - Aug_t.dot(aug_y)                  # 求残差


for item in range(m):                           # 重构的谱域向量
    pos = pos_selected_v[item]
    x_r = aug_y[item]
    try:
        hat_y[pos] = x_r
    except np.ComplexWarning:
        pass

hat_x = np.real(Psi.T.dot(hat_y))               # 做逆傅里叶变换重构得到时域信号


plt.plot(hat_x, marker='.', color='r')           # 重建信号
#plt.plot(x)                                     # 原始信号
plt.show()


有问题或者想交流可以添加我的微信公众号
在这里插入图片描述

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 压缩感知DOA算法是一种用于高分辨率方向信号估计的方法。在该算法中,通过在阵列中使用稀疏线性组合的方式来捕捉传感器阵列中的方向信息。这种方法在压缩领域中得到了广泛的应用,因为它能够在保持较高准确性的同时显著减小数据量。 压缩感知DOA算法代码分析主要包括以下几个方面。 首先,算法需要对输入的传感器数据进行处理和分析。这包括对传感器阵列接收到的信号进行采样和量化,以及对阵列数据进行预处理和滤波。这些处理步骤可以通过代码实现,以确保从原始数据中提取出有用的信息。 其次,算法需要对处理后的数据进行压缩感知处理。这包括对数据进行稀疏表示,使用稀疏线性组合的方法对信号进行解析,以及通过求解优化问题来估计信号的方向。这些处理步骤也可以通过相应的代码实现,并结合压缩感知的数学理论和算法进行优化。 最后,算法需要对估计出的方向进行恢复和后处理。这包括对估计出的方向进行精确化调整,消除估计误差,提高估计精度。这一步骤的实现可以通过利用波束形成和信号处理技术来实现。 需要指出的是,压缩感知DOA算法的性能与具体的实现方式以及所使用的硬件和软件平台有关。合理选取算法参数和优化算法实现可以提高算法的性能,同时,采用高性能的硬件平台可以进一步提高算法的实时性和效率。 总的来说,压缩感知DOA算法通过利用稀疏线性组合的方式在传感器阵列中提取方向信息,具有较高的准确性和较小的数据量。通过进行代码分析和优化实现,可以进一步提高算法的性能和效率。 ### 回答2: 压缩感知(Compressed Sensing,CS)是一种通过对信号进行稀疏表示和重建来实现信号压缩和恢复的新型信号处理技术。压缩感知领域的方向之一是方向估计(Direction of Arrival,DOA),即通过使用尽可能少的传感器来准确地确定信号的来向。 压缩感知DOA算法是在CS理论的基础上进行改进和应用的。该算法通过在测量中使用随机投影矩阵,将原始信号压缩为稀疏表示。然后,使用稀疏表示的测量结果进行反向重建,估计信号的DOA。 压缩感知DOA算法的性能可以通过以下几个方面进行代码分析: 1. 稀疏表示的构建:算法中的第一步是将原始信号进行稀疏表示。这可以通过使用压缩感知理论中的正交配追踪(Orthogonal Matching Pursuit,OMP)或基于L1范数的最小稀疏度算法实现。在代码中,需要实现这些算法,并根据信号的特点选择合适的稀疏表示方法。 2. 随机投影矩阵的设计:算法中需要使用随机投影矩阵将原始信号压缩为稀疏表示。这可以通过使用高斯随机矩阵、伯努利随机矩阵等方法来实现。在代码中,需要实现这些矩阵的生成算法,并根据压缩感知理论的要求进行优化。 3. DOA的估计算法:在测量结果得到的稀疏表示的基础上,需要使用合适的DOA估计算法来恢复信号的来向。这可以使用基于最大似然估计(Maximum Likelihood Estimation,MLE)、迭代最小二乘(Iterative Least Squares,ILS)等方法来实现。在代码中,需要实现这些算法,并根据测量结果和先验信息进行准确的DOA估计。 压缩感知DOA算法的性能评估可以使用PSNR(Peak Signal to Noise Ratio)、角度误差(Angular Error)等指标来进行量化分析。通过调整算法的参数,比如稀疏度、测量噪声等,可以进一步优化算法的性能。 ### 回答3: 压缩感知DOA算法是一种用于估计多路径信号的传输方向的算法。其主要特点是通过计算信号压缩感知矩阵,将信号的采样和压缩合并在一起,从而可以在较低的采样率下实现高分辨率的传输方向估计。以下是对压缩感知DOA算法性能代码的分析。 首先,我们需要对输入信号进行采样和压缩,得到压缩后的信号。通常情况下,这个过程是由硬件设备完成的,而在代码中,我们需要模拟这个过程。这部分代码主要包括信号采样和压缩矩阵的构建。 其次,我们需要对压缩后的信号进行解压缩和恢复。解压缩的过程通常是通过矩阵运算来实现的,这部分代码主要涉及到矩阵的乘法和逆运算。恢复信号的过程通常也需要对信号进行滤波和幅度调整,以便更好地提取出信号的DOA信息。 接着,我们需要进行传输方向估计。传输方向估计通常是通过对解压缩后的信号进行空域或频域分析来实现的。对于空域分析,我们可以通过对信号进行波束形成来提高传输方向的分辨率。对于频域分析,我们可以通过对信号进行频谱分析来估计信号的DOA。 最后,我们需要对传输方向估计的性能进行评估。通常情况下,我们可以通过比较估计结果和真实结果之间的误差来评估算法的性能。这部分代码主要包括误差计算和性能指标的计算。 总结起来,压缩感知DOA算法的性能代码分析主要包括信号采样和压缩、解压缩和信号恢复、传输方向估计以及性能评估这几个方面。在编写代码时,需要注意算法实现细节,并进行适当的优化,以提高算法的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值