閱讀原文還請移步個人知乎專欄:
https://www.zhihu.com/column/c_1287066237843951616
首先力薦鄢社鋒老師的書籍《優化陣列信號處理》,對於麥克風陣列信號處理的講解很是全面,對陣列的基本概念與優化方法講的非常透徹,並且最重要事情固然是全中文的啦,並且鄢社鋒是本領域的頂尖專家,比不少翻譯過來的外文書籍要好不少,值得閱讀。我的感受比陳老師的《Microphone Array Signal Processing》要更容易理解、更容易上手不少,由於這本書裏面包含了不少的案例用以對比演示。可是很遺憾,我並無找到鄢老師的相關代碼,因此乾脆就本身動手,看書的同時順帶實現了幾個。優化
因此,本文是後續系列文章的第一篇,記錄案例實現的過程與代碼,對於案例的解釋主要爲原書內容,本身進行了簡化,便於後續理解。本文講述第二章的案例2.二、2.3與2.4,對比試驗了常規波束造成與MVDR最優波束造成的波束圖、方位掃描圖與陣增益,以及本身實現的代碼。spa
例2.2 常規波束圖、常規波束掃描方位譜
考慮一個10元標準線列陣,假設一功率爲1的單頻信號從 方向入射到基陣,不考慮噪聲,用以下公式計算數據協方差矩陣:翻譯
以基陣在 方向的響應向量做爲導向向量,即 ,採用式設計
計算常規波束加權向量,用式3d
波束圖code
計算波束響應。將獲得的波束圖顯示於圖 2(a)中。圖中能夠看見波束主瓣指向方位。這意味着該波束造成器對方向到達的信號響應最大。附代碼實現,在圖片上方。orm
%% 2(a) 常規波束造成波束圖 代碼實現部分 clear; close all; clc; c=340; %聲速 f=1000; %頻率 lambda = c / f; k = 2*pi*f / c; space = lambda/2; %麥克風間距 M = 10; %麥克風數量 theta_d = 80*pi/180; %入射角度 theta_angle = 0:0.1:180; theta = theta_angle*pi/180; Wc = exp(-1i*k*space*[0:M-1]*cos(theta_d)) / M; B = zeros(size(theta)); %% 計算波束圖 for i = 1:length(theta) p = exp(1i*k*space*[0:M-1]*cos(theta(i))); B(i) = conj(Wc)*p'; end B_db = 20*log10(B); limit_dB = -50; index = B_db < limit_dB; B_db(index) = limit_dB; figure; plot(theta_angle, B_db, 'linewidth', 1.5); grid on;xlabel('方位(^o)'); ylabel('20lg(B)/dB'); title('波束圖');
2(a) 常規波束造成波束圖blog
波束掃描方位譜
進行波束掃描,即讓 在 內變化,取導向向量爲 。用下式圖片
計算出波束掃描方位譜,顯示於圖 2(b)中。從圖中能夠看出,在 位存在一個主峯值,該峯值表示在該方位存在一個信號。峯值大小爲 0dB,表示該方位波束輸出功率爲1,即該方向到達信號功率估計值爲1。同時注意到,雖然只有方向存在信號,其餘方位沒有信號,但從方位譜上觀察,其餘方位的波束輸出功率並不爲0,好像是出現了「能量泄漏」。這是因爲波束旁瓣引發的,對於遠離信號方向的波束,因爲常規波束的旁瓣比較高,即便信號位於這些波束的旁瓣,旁瓣對該信號有必定的抑制,可是波束輸出並不爲0,所以表現爲在方位譜上非信號方向存在輸出功率。能夠預見,因爲常規波束較高的旁瓣,可能會由於強信號的「能量泄漏」而淹沒了其餘方位的弱信號,這一點在後文的仿真中將會看到。ci
比較圖2(a)與圖2(b)發現,指向信號方向的常規波束圖與常規波束掃描方位譜曲線徹底相同。這是在僅存在單位功率平面波信號時常規波束造成特有的現象,其餘波束造成方法不存在此現象。假設基陣接收到功率爲 0dB的空間白噪聲,信號功率增長到 30dB,即輸入信噪比 。採用常規波束掃描獲得的方位譜如圖 2(c)所示,圖中指示在 方向方位譜大約爲 30dB,表示該方位信號功率估計值約爲 30dB。代碼實現參考 2(b),再也不贅述。
%% 2(b) 常規波束掃描方位譜,代碼實現部分 p = exp(1i*k*space*[0:M-1]*cos(theta_d)); Rx = (p')*conj(p); B = zeros(size(theta)); for i = 1:length(theta) Wcc = exp(-1i*k*space*[0:M-1]*cos(theta(i))) / M; B(i) = conj(Wcc)*Rx*Wcc'; end B_db = 10*log10(B); limit_dB = -50; index = B_db < limit_dB; B_db(index) = limit_dB; figure; plot(theta_angle, B_db, 'linewidth', 1.5); grid on; xlabel('方位(^o)'); ylabel('10lg(P)/dB'); title('波束掃描方位譜');
2(b) 常規波束掃描方位譜
2(c) 常規波束掃描方位圖
波束陣增益
應用公式:
計算掃描到各方位時波束陣增益,顯示於圖 2(d)中。圖中可見,該曲線形狀與圖2(a)中波束形狀相同,但高出10dB ,即爲最高陣增益。從該圖能夠知,當波束對準信號方向時,波束造成器的陣增益最大;波束觀察方位與信號方位存在誤差時,波束陣增益減少。只要方位誤差不太大(在半功率束寬之內),陣增益比最大值降低得並很少。
%% 2(d) 常規波束陣增益 代碼實現部分 p_ = exp(1i*k*space*[0:M-1]*cos(theta_d)); B = zeros(size(theta)); for i = 1:length(theta) p = exp(1i*k*space*[0:M-1]*cos(theta(i))); B(i) = (conj(p_) * p').^2 / (conj(p_)*p_'); end B_db = 10*log10(B); limit_dB = -50; index = B_db < limit_dB; B_db(index) = limit_dB; figure; plot(theta_angle, B_db, 'linewidth', 1.5); grid on; xlabel('方位(^o)'); ylabel('10lg(G)/dB'); title('不一樣方向波束陣增益');
2(d) 常規波束陣增益
例2.3 MVDR波束造成
考慮一個10元標準線列陣,假設基陣接收噪聲是功率爲0dB 高斯白噪聲,即 。一信噪比爲 的單頻信號從 方向入射到基陣,用下式計算數據協方差矩陣 。
MVDR波束造成器波束圖
採用下式
設計MVDR 波束造成器加權向量。圖 3(a)顯示了觀察方向分別爲與 的兩個波束圖。對於 方向波束造成器,它至關於 的狀況, 方向平面波被視做干擾;對於方向波束,方向平面波爲指望信號,對應於 的狀況。
對於方向的波束圖,它在方向的響應爲 。因爲MVDR波束造成器的特性,爲了使波束輸出功率最小,該波束在 方向造成零點以最大限度抑制來自該方向的干擾。對於方向的波束圖,假想導向向量與真實基陣響應向量相等,又因爲,該MVDR波束造成器蛻化爲常規波束造成器,因此該波束圖與圖 2(a)中的常規波束圖相同。
%% 3(a) MVDR波束造成器波束圖,代碼實現 c=340; %聲速 f=1000; %頻率 lambda = c / f; k = 2*pi*f / c; space = lambda/2; %麥克風間距 M = 10; %麥克風數量 theta_angle = 0:0.1:180; theta = theta_angle*pi/180; theta_d1 = 80*pi/180; %入射角度 p_1 = exp(1i*k*space*[0:M-1]*cos(theta_d1))'; Rx = conj(p_1)*p_1'*10^(30/10) + eye(M)*10^(0/10); Wc = Rx\p_1 / (conj(p_1')*inv(Rx)*p_1); B = zeros(size(theta)); %% 計算波束圖 80度 for i = 1:length(theta) p = exp(1i*k*space*[0:M-1]*cos(theta(i)))'; B(i) = conj(Wc')*p; end B_db = 20*log10(B); limit_dB = -50; index = B_db < limit_dB; B_db(index) = limit_dB; figure; plot(theta_angle, B_db, 'linewidth', 1.5); hold on;
3(a) MVDR波束造成器波束圖
MVDR波束掃描方位譜
採用MVDR波束掃描估計方位譜,其中掃描方位間隔爲 ,獲得的方位譜顯示於圖 3(b)中。與圖 2(b)相比較可見,MVDR波束掃描獲得的方位譜峯值更尖銳。可見,MVDR波束掃描能提供比常規波束掃描較高的方位分辨能力。
%% 3(b) MVDR波束造成器波束掃描方位譜圖,代碼實現 theta_angle = 0:1:180; theta = theta_angle*pi/180; theta_d1 = 80*pi/180; %入射角度1 p_1 = exp(1i*k*space*[0:M-1]*cos(theta_d1))'; Rx = (p_1)*conj(p_1')*10^(30/10); B = zeros(size(theta)); for i = 1:length(theta) p = exp(1i*k*space*[0:M-1]*cos(theta(i)))'; Wcc = Rx\p / (conj(p')*(Rx\p)); B(i) = conj(Wcc')*Rx*Wcc; end B_db = 10*log10(B); limit_dB = -10; index = B_db < limit_dB; B_db(index) = limit_dB; figure; plot(theta_angle, B_db, 'linewidth', 1.5); hold on; plot(80, 30, 'ro', 'linewidth', 1.5); grid on; legend('方位譜', '真實信號'); xlabel('方位(^o)'); ylabel('10lg(P)/dB'); title('波束掃描方位譜');
3(b) MVDR波束造成器波束掃描方位譜圖
MVDR波束造成器加權向量範數
圖 3(v)顯示了各掃描方位波束的加權向量範數 。從圖中能夠看出,在波束觀察方向距離信號方向較遠時(例如本例中與信號間隔 以上),波束造成器加權向量範數較小,接近於最小值。間隔較近時,隨着間隔減少,加權向量範數逐漸增長;而當波束方向剛好等於信號方向時,加權向量範數忽然降低到與間隔較遠的方位同一大小(由於此時波束造成器蛻化爲常規波束造成器)。
%% 3(c) MVDR波束造成器加權向量範數,代碼實現 theta_angle = 0:0.1:180; theta = theta_angle*pi/180; theta_d1 = 90*pi/180; %入射角度1 p_1 = exp(1i*k*space*[0:M-1]*cos(theta_d1))'; Rx = (p_1)*conj(p_1')*10^(30/10); B = zeros(size(theta)); for i = 1:length(theta) p = exp(1i*k*space*[0:M-1]*cos(theta(i)))'; Wcc = Rx\p / (conj(p')*(Rx\p)); B(i) = norm(Wcc)*norm(Wcc); end B_db = 10*log10(B); limit_dB = -50; index = B_db < limit_dB; B_db(index) = limit_dB; figure; plot(theta_angle, B_db, 'linewidth', 1.5); grid on; xlabel('方位(^o)'); ylabel('10lg(w^2)/dB'); title('加權向量範數');
3(c) MVDR波束造成器加權向量範數
例2.4 兩信號源狀況下MVDR與常規波束造成器的比較
考慮一個 10元標準線列陣,基陣接收噪聲是功率爲 0dB高斯白噪聲,兩個信噪比分別爲 15dB與 30dB的單頻信號分別從 與 方向入射到基陣。
分別採用常規波束造成與MVDR波束造成掃描,獲得的方位譜分別如圖4(a) 與圖4(b) 所示。
4(a) 兩信號源常規波束造成器
4(b) 兩信號源MVDR波束造成器
參考資料
一、《優化陣列信號處理》,鄢社鋒