[實戰] 天線陣列波束成形原理詳解與仿真實戰(完整代碼)

天線陣列波束成形原理詳解與仿真實戰

1. 引言

在無線通信、雷達和聲學系統中,波束成形(Beamforming)是一種通過調整天線陣列中各個陣元的信號相位和幅度,將電磁波能量集中在特定方向的技術。其核心目標是通過空間濾波增強目標方向的信號,同時抑制干擾和噪聲。本文將從陣列模型、波束成形原理、數學推導及波束增益計算等方面展開詳細分析。


2. 天線陣列模型

2.1 均勻線性陣列(ULA)

假設一個由 N N N個各向同性陣元組成的均勻線性陣列(Uniform Linear Array, ULA),陣元間距為 d d d。以第一個陣元為參考點,第 n n n個陣元的位置為:
x n = ( n ? 1 ) d ( n = 1 , 2 , … , N ) x_n = (n-1)d \quad (n=1,2,\dots,N) xn?=(n?1)d(n=1,2,,N)

2.2 遠場假設

當信號源距離陣列足夠遠時,入射波可視為平面波。假設信號入射方向與陣列法線方向的夾角為 θ \theta θ,則相鄰陣元間的相位差為:
Δ ? = 2 π d sin ? θ λ \Delta \phi = \frac{2\pi d \sin\theta}{\lambda} Δ?=λ2πdsinθ?
其中 λ \lambda λ為波長。


3. 波束成形的基本原理

3.1 陣列響應向量

對于入射角度 θ \theta θ,陣列的響應向量(導向向量)為:
a ( θ ) = [ 1 , e j Δ ? , e j 2 Δ ? , … , e j ( N ? 1 ) Δ ? ] T \mathbf{a}(\theta) = \left[ 1, e^{j\Delta\phi}, e^{j2\Delta\phi}, \dots, e^{j(N-1)\Delta\phi} \right]^T a(θ)=[1,ejΔ?,ej?,,ej(N?1)Δ?]T

3.2 加權合成

通過為每個陣元分配復權重 w n w_n wn?,合成輸出信號為:
y ( t ) = w H x ( t ) = ∑ n = 1 N w n ? x n ( t ) y(t) = \mathbf{w}^H \mathbf{x}(t) = \sum_{n=1}^N w_n^* x_n(t) y(t)=wHx(t)=n=1N?wn??xn?(t)
其中 w = [ w 1 , w 2 , … , w N ] T \mathbf{w} = [w_1, w_2, \dots, w_N]^T w=[w1?,w2?,,wN?]T為權重向量, x ( t ) \mathbf{x}(t) x(t)為接收信號向量。

3.3 波束方向圖

陣列的波束方向圖(Array Factor, AF)定義為:
A F ( θ ) = w H a ( θ ) = ∑ n = 1 N w n ? e j ( n ? 1 ) Δ ? AF(\theta) = \mathbf{w}^H \mathbf{a}(\theta) = \sum_{n=1}^N w_n^* e^{j(n-1)\Delta\phi} AF(θ)=wHa(θ)=n=1N?wn??ej(n?1)Δ?


4. 數學推導:波束成形的實現

4.1 相位補償法

若需使主瓣對準方向 θ 0 \theta_0 θ0?,需補償相鄰陣元間的相位差。權重向量設計為:
w n = e ? j ( n ? 1 ) 2 π d sin ? θ 0 λ w_n = e^{-j(n-1)\frac{2\pi d \sin\theta_0}{\lambda}} wn?=e?j(n?1)λ2πdsinθ0??
此時,方向圖在 θ 0 \theta_0 θ0?處達到最大值。

4.2 波束方向圖分析

代入權重后,方向圖簡化為:
A F ( θ ) = ∑ n = 0 N ? 1 e j n 2 π d λ ( sin ? θ ? sin ? θ 0 ) AF(\theta) = \sum_{n=0}^{N-1} e^{j n \frac{2\pi d}{\lambda} (\sin\theta - \sin\theta_0)} AF(θ)=n=0N?1?ejnλ2πd?(sinθ?sinθ0?)
利用等比數列求和公式:
A F ( θ ) = sin ? ( N ? π d λ ( sin ? θ ? sin ? θ 0 ) ) sin ? ( π d λ ( sin ? θ ? sin ? θ 0 ) ) AF(\theta) = \frac{\sin\left( N \cdot \frac{\pi d}{\lambda} (\sin\theta - \sin\theta_0) \right)}{\sin\left( \frac{\pi d}{\lambda} (\sin\theta - \sin\theta_0) \right)} AF(θ)=sin(λπd?(sinθ?sinθ0?))sin(N?λπd?(sinθ?sinθ0?))?

4.3 主瓣與柵瓣

  • 主瓣寬度:與 N N N成反比, N N N越大波束越窄。
  • 柵瓣條件:當 d / λ > 0.5 d/\lambda > 0.5 d/λ>0.5時,可能出現多個主瓣(柵瓣)。

5. 波束增益計算

5.1 方向性系數

波束增益 G G G定義為最大輻射強度與各向同性輻射器的比值:
G = 4 π ∣ A F ( θ 0 ) ∣ 2 ∫ 0 2 π ∫ 0 π ∣ A F ( θ , ? ) ∣ 2 sin ? θ d θ d ? G = \frac{4\pi |AF(\theta_0)|^2}{\int_0^{2\pi} \int_0^{\pi} |AF(\theta,\phi)|^2 \sin\theta d\theta d\phi} G=02π?0π?AF(θ,?)2sinθdθd?4πAF(θ0?)2?
對于均勻加權ULA,最大增益近似為:
G ≈ N ? ( 4 π d λ ) G \approx N \cdot \left( \frac{4\pi d}{\lambda} \right) GN?(λ4πd?)

5.2 陣元間距影響

  • 最優間距:通常取 d = λ / 2 d = \lambda/2 d=λ/2,以避免柵瓣并最大化增益。
  • 過密陣元:間距過小導致互耦效應,降低效率。

5.3 實際增益公式

考慮效率 η \eta η后,實際增益為:
G r e a l = η ? N ? G e l e m e n t G_{real} = \eta \cdot N \cdot G_{element} Greal?=η?N?Gelement?
其中 G e l e m e n t G_{element} Gelement?為單個陣元的增益。


6. 影響波束增益的關鍵因素

  1. 陣元數量(N):增益隨 N N N線性增加。
  2. 權重設計:非均勻加權(如切比雪夫加權)可降低旁瓣,但略微減小主瓣增益。
  3. 頻率與帶寬:寬帶信號需考慮色散效應。
  4. 陣元方向性:若陣元非各向同性,總增益需乘以陣元方向圖。
  5. 掃描角度:掃描至端射方向( θ = 9 0 ° \theta = 90^\circ θ=90°)時增益下降。

7. 擴展:平面陣列與二維波束成形

對于 M × N M \times N M×N平面陣列,導向向量為:
a ( θ , ? ) = a x ( θ , ? ) ? a y ( θ , ? ) \mathbf{a}(\theta, \phi) = \mathbf{a}_x(\theta, \phi) \otimes \mathbf{a}_y(\theta, \phi) a(θ,?)=ax?(θ,?)?ay?(θ,?)
其中 ? \otimes ?表示Kronecker積。增益提升至 M × N M \times N M×N倍。


8. 仿真

這里直接提供仿真代碼和仿真結果:
先說結果,采用32陣元的陣列進行仿真,陣列布局如圖如下,陣元間隔0.8 λ \lambda λ
在這里插入圖片描述
仿真在俯仰角60度時,方位角指向不同方向的波束情況如下:
在這里插入圖片描述
完整代碼作為福利,如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Apr  8 22:13:36 2025@author: neol
"""import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Dplt.close('all')
# 設置全局字體為支持中文的字體
plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei']  # 黑體
# 解決負號顯示問題
plt.rcParams['axes.unicode_minus'] = False# 參數設置
c = 299792458  # 光速
freq = 1268.52e6  # 頻率
wavelength = c / freq  # 波長
d = wavelength*0.7 # 陣元間距
N = 6  # 網格尺寸(6x6)
theta_res = 1  # 角度分辨率(度)# 生成陣元位置(四角空缺)
positions = []
for i in range(N):for j in range(N):# 排除四個角落(0,0),(0,5),(5,0),(5,5)if (i==0 and j==0) or (i==0 and j==5) or (i==5 and j==0) or (i==5 and j==5):continuepositions.append([i*d - (N-1)*d/2, j*d - (N-1)*d/2, 0])  # 中心對齊positions = np.array(positions)
num_elements = len(positions)
print(f"有效陣元數量: {num_elements}")# 生成12個目標方向(方位角均勻分布)
num_beams = 12
phi_targets = np.linspace(0, 2*np.pi, num_beams, endpoint=False)
# theta_target = np.pi/2  # 固定俯仰角為90度(水平面)
pitch = 60
theta_target = np.radians(pitch)  # 俯仰角設置# 波束方向圖計算函數
def calculate_beam_pattern(weights, positions, wavelength):theta = np.linspace(0, np.pi, 181)phi = np.linspace(0, 2*np.pi, 361)THETA, PHI = np.meshgrid(theta, phi)# 轉換為直角坐標X = np.sin(THETA) * np.cos(PHI)Y = np.sin(THETA) * np.sin(PHI)Z = np.cos(THETA)pattern = np.zeros_like(THETA, dtype=np.complex128)# 計算每個陣元的貢獻for i, pos in enumerate(positions):phase_shift = 2*np.pi/wavelength * (pos[0]*X + pos[1]*Y + pos[2]*Z)pattern += weights[i] * np.exp(1j*phase_shift)return 20*np.log10(np.abs(pattern))# 創建繪圖
fig = plt.figure(figsize=(18,12))
fig.suptitle('32-Element Array Beam Patterns (12 Directions)', fontsize=16)# 為每個波束生成權重并繪圖
for beam_idx in range(num_beams):# 當前目標方向phi_target = phi_targets[beam_idx]# 計算導向矢量steering_vector = np.zeros(num_elements, dtype=np.complex128)for i, pos in enumerate(positions):phase = 2*np.pi/wavelength * (pos[0]*np.sin(theta_target)*np.cos(phi_target) +pos[1]*np.sin(theta_target)*np.sin(phi_target) +pos[2]*np.cos(theta_target))steering_vector[i] = np.exp(-1j*phase)# 歸一化權重weights = steering_vector / np.linalg.norm(steering_vector)# 計算方向圖pattern = calculate_beam_pattern(weights, positions, wavelength)# 轉換為極坐標并繪圖ax = fig.add_subplot(3, 4, beam_idx+1, projection='polar')ax.set_theta_offset(np.pi/2)ax.set_theta_direction(-1)#標志主瓣方向r_max = 15r_min = -40ax.plot([phi_target, phi_target], [r_min, r_max], color='red', linestyle='--', linewidth=1.5, alpha=0.8)phi_plot = np.linspace(0, 2*np.pi, 361)theta_plot = np.linspace(0, np.pi, 181)# 提取水平面方向圖horizontal_cut = pattern[:, pitch]  # theta=90度# 繪制極坐標圖ax.plot(phi_plot, horizontal_cut, linewidth=1.5)ax.set_title(f'Beam {beam_idx+1}\nAzimuth={np.degrees(phi_target):.1f}°\nPitch={pitch:.1f}°', pad=20)ax.set_rlim(r_min, r_max)ax.grid(True)plt.tight_layout()
plt.show()# 繪制陣列幾何布局
plt.figure(figsize=(8,6))
plt.scatter(positions[:,0]/wavelength, positions[:,1]/wavelength, s=50, c='r')
plt.title('Array Geometry (Wavelength Normalized)')
plt.xlabel('X (λ)')
plt.ylabel('Y (λ)')
plt.grid(True)
plt.axis('equal')
plt.show()

9. 結論

天線陣列波束成形通過精確控制各陣元的相位和幅度,實現了信號的空間選擇性。其性能直接取決于陣元數量、間距及權重設計。理解其數學本質和增益限制因素,對5G Massive MIMO、雷達等系統設計至關重要。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75958.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深圳漫云科技戶外公園實景兒童劇本殺小程序:開啟親子互動新紀元

在親子娛樂需求日益增長的當下,深圳漫云科技推出的戶外公園實景兒童劇本殺小程序,憑借其創新玩法與豐富功能,為親子家庭帶來全新體驗。該小程序融合戶外探險、角色扮演與邏輯推理,不僅滿足孩子好奇心,更提升其思維能力…

HOW - 如何測試 React 代碼

目錄 一、使用 React 測試庫:testing-library/react二、使用測試演練場:testing-playground.com三、使用 Cypress 或 Playwright 進行端到端測試四、使用 MSW 在測試中模擬網絡請求 一、使用 React 測試庫:testing-library/react testing-li…

COBOL語言的網絡安全

COBOL語言與網絡安全:傳統語言的新挑戰 引言 COBOL(Common Business-Oriented Language)是一種早期編程語言,最初于1959年被開發出來,主要用于商業、金融和行政系統的處理。盡管年代久遠,COBOL在大型機系…

通過世界排名第一的免費開源ERP,構建富有彈性的智能供應鏈

概述 現行供應鏈模式的結構性弱點凸顯了對整個行業進行重塑的必要性。正確策略和支持可以幫助您重塑供應鏈,降低成本,實現業務轉型。開源智造(OSCG)所推出的Odoo免費開源ERP解決方案,將供應鏈轉化為具有快速響應能力的…

Android 開發中compileSdkVersion 和 targetSdkVersion

在 Android 開發中,compileSdkVersion 和 targetSdkVersion 是 build.gradle 文件中的兩個關鍵配置,它們分別控制應用的編譯行為和運行時兼容性。以下是它們的詳細區別和用途: 1. compileSdkVersion(編譯版本) 作用&a…

Qt QComboBox 下拉復選多選

Qt 中,QComboBox 默認只支持單選,但實際使用過程中,我們經常會碰到需要多選的情況,但是通過一些直接或者曲折的方法還是可以實現的。 1、通過 QListWidget 間接實現 這種方式是網上搜索最多的一種方式,也是相對來說比…

Selenium自動化:玩轉瀏覽器,搞定動態頁面爬取

嘿,各位爬蟲愛好者和自動化達人們!是不是經常遇到這種情況:信心滿滿地寫好爬蟲,requests一把梭,結果抓下來的HTML里,想要的數據空空如也?定睛一看,原來數據是靠JavaScript動態加載出…

天梯賽 L2-023 圖著色問題

使用vector<vector<int>> g(N)去存儲邊&#xff0c;然后每次判斷每個節點的鄰節點是不是相同的顏色&#xff0c;需要注意的是不同的顏色一定需要為K種&#xff0c;不能多也不能少。 #include<bits/stdc.h> using namespace std; int main(){int n,m,k;cin&g…

在ubuntu24上裝ubuntu22

實驗室上有一臺只裝了ubuntu24的電腦&#xff0c;但是項目要求在22上進行 搞兩個ubuntu系統&#xff01; 步驟一&#xff1a;制作22的啟動盤 步驟二&#xff1a;進入bios安裝界面 步驟三&#xff1a;選擇try or install ubuntu 步驟四&#xff1a;選擇try ubuntu 步驟五&…

【PVR Review】《Review of Deep Learning Methods for Palm Vein Recognition》

[1]譚振林,劉子良,黃藹權,等.掌靜脈識別的深度學習方法綜述[J].計算機工程與應用,2024,60(06):55-67. 文章目錄 1、Background and Motivation2、數據采集3、掌脈圖像預處理3.1、ROI提取算法3.2、圖像濾波與增強 4、掌脈識別算法4.1、基于深度學習的方法4.2、其他方法 5、融合識…

【CSP】202403-1詞頻統計

文章目錄 算法思路1. 數據結構選擇2. 輸入處理3. 統計出現的文章數4. 輸出結果 代碼示例代碼優化 樣例輸入 4 3 5 1 2 3 2 1 1 1 3 2 2 2 2 3 2樣例輸出 2 3 3 6 2 2算法思路 1. 數據結構選擇 vector<int>&#xff1a;用于存儲每篇文章的單詞列表&#xff08;可能包含…

Docker基礎1

本篇文章我將從系統的知識體系講解docker的由來和在linux中的安裝下載 隨后的文章會介紹下載鏡像、啟動新容器、登錄新容器 如需轉載&#xff0c;標記出處 docker的出現就是為了節省資本和服務器資源 當企業需要一個新的應用程序時&#xff0c;需要為它買臺全新的服務器。這樣…

Linux系統學習Day04 阻塞特性,文件狀態及文件夾查詢

知識點4【文件的阻塞特性】 文件描述符 默認為 阻塞 的 比如&#xff1a;我們讀取文件數據的時候&#xff0c;如果文件緩沖區沒有數據&#xff0c;就需要等待數據的到來&#xff0c;這就是阻塞 當然寫入的時候&#xff0c;如果發現緩沖區是滿的&#xff0c;也需要等待刷新緩…

vue 3 從零開始到掌握

vue3從零開始一篇文章帶你學習 升級vue CLI 使用命令 ## 查看vue/cli版本&#xff0c;確保vue/cli版本在4.5.0以上 vue --version ## 安裝或者升級你的vue/cli npm install -g vue/cli ## 創建 vue create vue_test ## 啟動 cd vue_test npm run servenvm管理node版本&#…

Mysql專題篇章

一、事務的四大特性&#xff1f; 1、原子性&#xff1a;是指事務包含的所有操作要么全部成功&#xff0c;要么全部失敗回滾。 2、一致性&#xff1a;是指一個事務執行之前和執行之后都必須處于一致性狀態。比如a與b賬戶共有100塊&#xff0c;兩人之間轉賬之后無論成功還是失敗…

CAD插件實現:自動遞增編號(前綴、后綴、位數等)——CADc#實現

cad中大量輸入一定格式的遞增編號時&#xff0c;可用插件實現&#xff0c;效果如下&#xff1a; ①本插件可指定數字位數、起始號碼、加前綴、后綴、文字顏色等&#xff08;字體樣式和文字所在圖層為cad當前圖層和當前字體樣式&#xff09;。 ②插件采用Jig方式&#xff0c;即…

k8s1.24升級1.28

0、簡介 這里只用3臺服務器來做一個簡單的集群&#xff0c;當前版本是1.24.17目標升級到1.28.17 地址主機名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 因為1.24已經更換過了容器運行時&#xff0c;所以之后的升級相對就會簡單&am…

4.3-2 jenkins

一.登錄jenkins 二.修改密碼 三.配置節點 新建節點 編輯節點名稱 編輯節點配置 激活節點 將jar下載到指定的路徑 再到dos命令下的路徑 E:\az\wx 執行 配置節點成功 四. 安全設置中&#xff0c;勾選代理 五.新建項目 編輯項目名稱 編輯項目執行的 路徑&#xff1a;C:\Users\Ad…

js對象與數組的互轉

js對象與數組的互轉 文章目錄 js對象與數組的互轉一、數組轉對象1.使用forEach,for in,es6展開運算符,assign2. 使用 Object.fromEntries()3. 將數組轉為鍵值對對象4. 使用 reduce()4. 數組元素為對象時提取屬性 二、對象轉數組1. 提取鍵/值/鍵值對2. 轉換為特定結構的數組 三、…

HTTPS在信息傳輸時使用的混合加密機制,以及共享、公開密鑰加密的介紹。

HTTPS在信息傳輸時使用的混合加密機制&#xff0c;其中包括了共享密鑰加密和公開密鑰加密&#xff0c;我們先來介紹一下這兩種加密方式。 共享密鑰加密&#xff08;對稱密鑰&#xff09; 對稱加密是指加密和解密使用的是同一個密鑰。就像家里的門鎖&#xff0c;鑰匙只有一把&…