基本介绍
打算开一个系列,详细整理一下利用稀疏矩阵进行AOA计算,稀疏相当于对信号进行了压缩,如何从稀疏矩阵进行信号恢复,进而得到更加精细的AOA是4D毫米波雷达近期的研究中点。压缩感知(compressed sensing)是普遍用于声音信号和图像信号的恢复,在人工智能也有大量应用,比如特征值选取等。本文将结合代码介绍一下压缩感知的基础知识,期望大家获得一个基础印象,知道压缩感知是什么。
# make sure you've got the following packages installed
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import scipy.optimize as spopt
import scipy.fftpack as spfft
import scipy.ndimage as spimg
import cvxpy as cvx
# generate some data with noise
#这里利用随机数生成15个随机数据,随机数据的范围是0到10
x = np.sort(np.random.uniform(0, 10, 15))
#y是x的线性函数,这里加入了一些高斯噪声
y = 3 + 0.2 * x + 0.1 * np.random.randn(len(x))
# find L1 line fit
##利用lambda生成一个匿名函数,输入变量是x0,x,y,返回结果是 np.sum(np.abs(x0[0] * x + x0[1] - y))
#这个也叫一阶范式误差函数,我们用两个系数x0[0],x0[1]用线性函数拟合y和x的关系,这个是误差函数,我们只需求误差函数的最小值即可
l1_fit = lambda x0, x, y: np.sum(np.abs(x0[0] * x + x0[1] - y))
xopt1 = spopt.fmin(func=l1_fit, x0=[1, 1], args=(x, y)) #这里是求x0使l1_fit的返回值最小
#这里误差函数使用二阶范式,也就是误差的平方 加和
# find L2 line fit
l2_fit = lambda x0, x, y: np.sum((x0[0] * x + x0[1] - y)**2)
xopt2 = spopt.fmin(func=l2_fit, x0=[1, 1], args=(x, y)) ##这里是求x0使l2_fit的返回值最小
Optimization terminated successfully.
Current function value: 1.192422
Iterations: 57
Function evaluations: 111
Optimization terminated successfully.
Current function value: 0.164720
Iterations: 60
Function evaluations: 116
plt.plot(x,y,"bo",label="original data")
plt.plot(x,xopt1[0] * x + xopt1[1],label="L1 Norms")
plt.plot(x,xopt2[0] * x + xopt2[1],label="L2 Norms")
plt.legend()
##由于我们在生成y的时候利用的高斯噪声,在直线的两端均匀分布)所以采用一阶范式误差和二阶范式误差均能准确的拟合曲线。
####上面程序,就是利用寻找误差函数的最小值进行线性曲线的拟合。现在我们生成一个由两个单音组成的函数,然后采样部分值(压缩),看能否通过部分值进行整个信号的恢复。
# sum of two sinusoids
n = 5000
t = np.linspace(0, 1/8, n)
y = np.sin(1200 * np.pi * t) + np.sin(3200 * np.pi * t)
yt = spfft.dct(y, norm='ortho'