数字波束形成----导向矢量方法及其特殊形式fft

本文详细解释了一维线阵的数字波束形成原理,介绍了导向矢量加权方法和快速傅里叶变换在估计到达方向(DoA)中的应用,以及两种方法在空间扫描步进上的差异。Matlab仿真代码提供了实践参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于均匀线阵或者面阵,数字波束形成主要有基于导向矢量加权合成的方法和快速傅里叶变换方法(fft)两种,对于法线方向的目标,其最优权矢量是傅里叶变换系数。

一、从一维线阵理解数字波束形成原理

对于一维阵列,假设阵元间距为d,波长为\lambda,且阵元间距d={\lambda }/{2}\;。电磁波的入射方向与阵面法线夹角为$\theta$。则相邻阵元接收到的信号的波数相差:

k=d\sin (\theta )/\lambda                                                                                 公式 1

则相邻阵元接收到的信号的相位差如下:

\Delta \phi =2\pi k=2\pi d\sin (\theta )/\lambda                                                            公式 2

在做波束形成时,只要将各阵元的相位差补偿即可。

二、导向矢量加权方法

假设窄带信号为:

s(t)=a(t){​{e}^{j\phi (t)}}{​{e}^{j2\pi {​{f}_{0}}t}}                                                                     公式 3

其中$\phi (t)$为t时刻目标回波信号相对于发射信号的延迟引起的相位差。对于阵元数为N的一维均匀线阵,以阵元1为参考,阵列接收的信号为(假设阵列是理想的,阵元间不存在幅度、相位误差):

                             \left[ \begin{array}{l} {s_1}(t)\\ {s_2}(t)\\ \cdots \cdots \\ {s_{\rm{N}}}(t) \end{array} \right] = \left[ \begin{array}{l} {a_1}(t){e^{j\phi (t)}}{e^{j2\pi {f_0}t}}\\ {a_2}(t){e^{j\phi (t)}}{e^{j2\pi {f_0}t}}{e^{j2\pi d\sin (\theta )/\lambda }}\\ \cdots \cdots \\ {a_{\rm{N}}}(t){e^{j\phi (t)}}{e^{j2\pi {f_0}t}}{e^{j2\pi {\rm{(N - 1)}}d\sin (\theta )/\lambda }} \end{array} \right]               公式 4

由于窄带信号的幅度和相位都是随着时延缓慢变化的,忽略各个阵元之间由于波程差造成的包络差别,即认为a\left( t \right)={​{a}_{n}}\left( t \right)\text{ },\left( n=1,2,\text{ }.\text{ }.\text{ }.\text{ },N \right)\text{ },则阵列接收信号可表示为:

\overset{\tilde{\ }}{\mathop{x}}\,(t)=a(t){​{e}^{j\phi (t)}}{​{[\begin{matrix} 1 & {​{e}^{j2\pi d\sin (\theta )/\lambda }} & \cdots & {​{e}^{j2\pi \text{(N-1)}d\sin (\theta )/\lambda }} \\ \end{matrix}]}^{T}}       公式 5

假设各阵元接收到的信号导向矢量为:

{​{\omega }_{n}}={​{b}_{n}}{​{e}^{-j{​{\phi }_{n}}}}(n=1,2,\cdots ,N)                                                     公式 6

则波束形成的输出为:

y(t)=\sum\limits_{n=1}^{N}{a(t){​{e}^{j\phi (t)}}{​{e}^{j2\pi(n\text{-1)}d\sin (\theta )/\lambda }}}{​{\omega }_{n}}=\sum\limits_{n=1}^{N}{a(t){​{e}^{j\phi (t)}}{​{e}^{j2\pi(n\text{-1)}d\sin (\theta )/\lambda }}}{​{b}_{n}}{​{e}^{-j{​{\phi }_{n}}}}                                     公式 7

从上面表达式不难知道,当{​{\omega }_{n}}刚好能够补偿各阵元相位差时,波束形成的输出取到最大值,因此利用导向矢量加权方法对信号的DOA进行估计时,可以让导向矢量${​{\omega }_{n}}={​{b}_{n}}{​{e}^{-j{​{\phi }_{n}}}}={​{b}_{n}}{​{e}^{-j2\pi (n-1)d\sin ({​{\theta }_{m}})/\lambda }}$。其中的${​{\theta }_{m}}$$\left[ \begin{matrix} 0 & \pi \\ \end{matrix} \right]$中进行遍历,当$y(t)$模值最大时,此时对应的角度${​{\theta }_{m}}$为来波的角度,如此即可完成DOA的估计。

$y(t)=\sum\limits_{n=1}^{N}{a(t){​{e}^{j\phi (t)}}{​{e}^{j2\pi(n\text{-1)}d\sin (\theta )/\lambda }}}{​{b}_{n}}{​{e}^{-j2\pi (n-1)d\sin ({​{\theta }_{m}})/\lambda }}$          公式 8

三、傅里叶变换方法

关于傅里叶变换及其与导向矢量关系的详细推导可以参考导频矢量推导与离散信号傅里叶变换_导频矩阵二维傅里叶变换-CSDN博客

对于傅里叶级数,其复数形式为:

f(t)=\sum\limits_{p=0}^{P-1}{​{​{C}_{p}}{​{e}^{jp{​{\omega }_{0}}t}}}                                                                          公式 9

傅里叶变换系数:

{​{C}_{p}}=\frac{1}{\text{N}}\sum\limits_{n=0}^{N-1}{f(n){​{e}^{-jp{​{\omega }_{0}}n}}}                                                                公式 10

傅里叶变换系数与数字波束形成形式一致。

f(n)={​{a}_{n}}(t){​{e}^{j\phi (t)}}{​{e}^{j2\pi(n\text{-1)}d\sin (\theta )/\lambda }},则上式可表示为:

{​{C}_{p}}=\frac{1}{\text{N}}\sum\limits_{n=0}^{N-1}{​{​{a}_{n}}(t){​{e}^{j\phi (t)}}{​{e}^{j2\pi(n\text{-1)}d\sin (\theta )/\lambda }}{​{e}^{-jp{​{\omega }_{0}}n}}}                            公式 11

四、两种方法的扫描空间的区别

需要特别指出的一点是,在对阵列信号进行空间普估计时,也即一定角度范围内对阵列信号的响应进行扫描时,导向矢量加权方法和fft方法的扫描步进是不同的。具体如下:

导向矢量加权方法

对于导向矢量加权方法,其空间扫描的角度分布可以任意指定,但一般情况下都会将扫描角度均匀分割。如要扫描$\left[ \begin{matrix} 0 & 90 \\ \end{matrix} \right]$度的角度范围(不包含90°),总共分为90个单元,则每个单元角度为1°。

傅里叶变换方法

对于fft方法,根据公式8,{​{C}_{p}}即为p{​{\omega }_{0}}对应的指向${​{\theta }_{p}}$的空间响应,即:

$p{​{\omega }_{0}}=2\pi d\sin ({​{\theta }_{p}})/\lambda $                                                                        公式 12

由于傅里叶变换特性,P是$\left[ \begin{matrix} 0 & \text{N-}1 \\ \end{matrix} \right]$内的整数,因此使用傅里叶变换时,空间扫描的角度分布为:

${​{\theta }_{p}}=\arcsin (\frac{p{​{\omega }_{0}}\lambda }{2\pi d})$                                                                            公式 13

可以看出${​{\theta }_{p}}$并不是均匀分布的,这是傅里叶变换方法与导向矢量加权方法的区别。应当注意的是,在分析傅里叶变换方法获得到阵列空间响应时,其角度维坐标应当为${​{\theta }_{p}}=\arcsin (\frac{p{​{\omega }_{0}}\lambda }{2\pi d})$,而非$\left[ \begin{matrix} 0 & 90 \\ \end{matrix} \right]$度的角度范围的均匀分割。

五、matlab仿真代码

matlab仿真代码链接:

数字波束形成导向矢量加权和fft方法资源-CSDN文库

### ADSP-BF561 实现信号处理功能 #### 信号包络提取 对于信号包络提取,在ADSP-BF561上可以通过希尔伯特变换来实现这一目标。具体来说,通过计算输入信号的解析信号并取其幅度分量作为包络[^1]。 ```c // 假设 input_signal 是待处理的时间序列数据 float *input_signal; int N = sizeof(input_signal)/sizeof(float); // 输入信号长度 // 创建 Hilbert 变换后的复数数组 complex float analytic_signal[N]; for(int i=0; i<N; ++i){ analytic_signal[i] = hilbert_transform(input_signal, N)[i]; } // 计算包络 float envelope[N]; for(int i=0; i<N; ++i){ envelope[i] = cabsf(analytic_signal[i]); } ``` #### 短时傅里叶变换(Short-Time FFT) 为了执行短时傅里叶变换(STFT),可以采用滑动窗口的方法对原始时间域内的信号片段进行离散傅立叶变换(DFT)操作。这通常涉及到选择合适的窗函数(如汉宁窗)以减少频谱泄漏效应,并设定重叠比例以便更好地捕捉瞬态特性。 ```matlab % MATLAB伪代码示例 window_size = 256; % 定义窗口大小 overlap_ratio = 0.5; % 设置相邻帧之间的重叠率 nfft = nextpow2(window_size); stft_result = spectrogram(signal,hanning(window_size), ... round(window_size*overlap_ratio), nfft, fs); ``` 需要注意的是上述MATLAB代码仅用于说明目的;实际C/C++编程环境下需调用相应的库函数完成相同的功能。 #### 波束形成算法 波束形成的目的是增强来自特定方向的目标回波而抑制其他角度上的干扰源。基于自适应滤波理论的一种常见方法是MVDR(Minimum Variance Distortionless Response)最小方差无失真响应准则下的权值优化方案。此过程涉及协方差矩阵估计、特征分解以及最终加权求和等步骤。 ```cpp Eigen::MatrixXd Rxx; // 协方差矩阵 Eigen::VectorXd w_optimal; // 最优权重向量 // 初始化参数... Rxx.setZero(); w_optimal.resize(num_elements); // 构建空间导向矢量 a(theta) auto steering_vector = [&](double theta)->Eigen::VectorXcd{ Eigen::VectorXcd a(num_elements); double k = 2*M_PI*f/c; for(size_t m=0;m<num_elements;++m){ a(m)=exp(-std::complex<double>(0,k*d*m*cos(theta))); } return a.normalized(); }; // MVDR 权重计算 void mvdr_weights(const std::vector<std::complex<float>>& rx_data, const double look_direction_degrees){ auto a_theta = steering_vector(deg2rad(look_direction_degrees)); Rxx.noalias() += ((rx_data.asDiagonal())*(a_theta*a_theta.adjoint())); Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es(Rxx); w_optimal = (es.eigenvectors().col(0)).real(); } ``` 这段代码展示了如何利用Eigen库来进行高效数值运算,从而实现了基本的MVDR波束成形器设计流程的一部分。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

动力澎湃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值