应用
DOA估计
原理
MUSIC算法,叫做多信号分类算法 (Multiple Signal Classification),是一种基于特征结构的高分辨率DOA算法。该算法利用了信号子空间和噪声子空间正交性的特点,构造噪声空间然后通过谱峰搜索来检测信号的波达方向。需要注意的是,该算法有一个前提,即各个入射信号之间互不相关,这样才能保证入射信号的协方差矩阵是满秩的。
一维阵列
线阵
二维阵列
矩阵
python实现
import numpy as np
import matplotlib.pyplot as plt
# 高斯白噪声
def awgn(x: np.array, snr: int or float) -> np.array:
# snr(dB)
len_x = len(x)
Ps = np.sum(np.power(x, 2)) / len_x
Pn = Ps / np.power(10, snr / 10)
n_gaussian = np.sqrt(Pn / 2) * np.random.randn(len_x)
return x + n_gaussian
f = 10e9 # 频率10GHz
c = 3e8 # 光速
l = c / f # 波长
d = l / 2 # 半波长
M = 10 # 阵元数
N = 100 # 快拍数(采样点)
K = 6 # 信源数
phi = np.asarray([-30, 0, 20, 40, 60, 75]) # 来波方向
phi = phi * np.pi / 180
dd = np.arange(M) * d
A = np.exp(-2j * np.pi * np.outer(dd, np.sin(phi)) / l)
S = np.sqrt(2) / (np.random.randn(K, N) + 1j * np.random.randn(K, N))
X = A @ S
Rx = X @ np.conj(X).T / N
V, U = np.linalg.eig(Rx)
index = np.argsort(V)[::-1]
U = U[:, index]
P = np.sum(V)
P_cum = np.cumsum(V)
J = np.where(P_cum / P >= 0.95)
Un = U[:, int(J[0][0]+1):]
theta = np.arange(-90, 90, 0.1)
theta = np.pi / 180 * theta
doa = np.exp(-2j * np.pi * np.outer(dd, np.sin(theta)) / l)
music = np.abs(1 / np.diag(np.conj(doa).T @ Un @ np.conj(Un).T @ doa))
music = 10 * np.log10(music/np.max(music))
plt.rcParams['font.family'] = ['SimSun', 'Times New Roman'] # 设置字体族,中文为SimSun,英文为Times New Roman
plt.rcParams['font.size'] = 12
plt.rcParams['lines.linewidth'] = 1
plt.rcParams['lines.color'] = 'r'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['mathtext.fontset'] = 'stix' # 设置数学公式字体为stix
fig, ax = plt.subplots(1, 1, figsize=(5, 3.95))
fig.set_tight_layout('pad')
ax.plot(np.arange(-90, 90, 0.1), music)
ax.set_ylabel('空间谱(dB)')
ax.set_xlabel('角度($^o$)')
plt.show()
标签:plt,music,算法,Music,rcParams,np,原理,90
From: https://www.cnblogs.com/hit-ztx/p/18290642