窄带波束形成——时域与频域常规窄带波束形成

这篇具有很好参考价值的文章主要介绍了窄带波束形成——时域与频域常规窄带波束形成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近学习了一下《最优阵列处理技术》,应老师要求写一个线性均匀水听器阵列的常规波束形成,由于是初学者,写的可能会有点问题,欢迎大家提出修改建议和指导,写这个主要是记录自己的思考,其次是和初学者进行交流提升。

1. 主要原理阐述

要实现波束形成,首先得了解频率波束响应,波束形成与之息息相关。

1.1 频率波数响应

对于一个水听器阵列,我们要想的得到其对外部信号场的响应,则需要对信号场在空域上进行采样,得到一组信号,表示为:

对每个阵元的输出用一个线性时不变滤波器进行处理,该滤波器的冲激响应为,并对所有输出求和,得到阵列的输出,该过程如下图示:

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

针对线性阵列,我们用一张图来说明一下:

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

设均匀阵元排列间隔为,假如信号平行射入,信号入射角度与端射方向呈角,则可以通过计算知道,相邻的阵元接收到信号的间隔为:

 设第一个阵元接收到的信号为,则第二个阵元接收到的信号为频域波束形成与时域波束形成区别,matlab,开发语言,矩阵,以此类推,在理想情况下,第n个阵元接收到的信号为:

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

为了能够还原我们想要的信号,我们可以使用一个延时求和波束形成器,其原理如下:

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

 式子表示为:

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

也可以写成频域内的简洁形式:

  其中,称作流形矢量,定义为:

右上角的H为共轭转置的意思。

 其中:

为信号的频率,为方向余弦,为介质中的信号传播速度。

为了进一步讲解,我们假设一个基函数,表示如下:

阵列处理器对一个平面波的响应:

 可以表示为:

在频域内,可以写为:

定义:

 为阵列的频率波束响应。

波束方向图的定义是用入射方向表示频率波数响应函数(在代码中我们使用的角度为60°,可以自行修改)。

2. 代码讲解

2.1 基函数

在代码中,我们沿用基函数:

在我们进行频率波数响应推导的时候,细心的朋友应该发现了,信号接收时间间隔的定义即为的定义,为位置表示,由于是在处理一个平面波信号,方向余弦仅需取一个方向,这里为,故根据的定义:

假设我们的信号为,其中,为信号声源的频率,那么我们现在可以表示每个阵元的接收信号:

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

打开有:

该部分代码为:

%% 目标信号生成
f0=300;               % 声源频率,Hz
s=exp(1j*2*pi*f0.*t); % 目标复数信号,1 x LEN  "1j为复数,1为数字一,j为负数"  
as=exp(1j*2*pi*ra*f0*cos(thetas_rad)/c); % 目标驾驶向量,N x 1,驾驶向量=exp(-2*pi*f0*τ*1j*)
snr=40;               % 信噪比设置
rx=awgn(real(as*s), snr, 'measured');     % 含加性高斯噪声的水听器输出时间波形实数矩阵,Add white Gaussian noise to signal
x = rx.';          % 输出波形矩阵转置,便于二维数组FFT列运算,LEN x N,即接收到的信号

s为源信号,as为流形矢量(也有称驾驶向量的说法),x为得到的输出信号。

注意:正常来讲,我们在进行信号接收时,应该在一定频率内进行扫描,获取不同频率信号再进行筛选;在代码中,我们假设的信号实际是简化了,相当于我们本来就知道信号的频率(设为300Hz),现在只需要在该频率下进行角度扫描,确定信号的来源

2.2 延时处理

接着,我们刚刚提到了延时求和波束形成器,根据频率响应函数的定义,我们需要对信号基函数进行延时求和,由此得到波束方向图:

 我们在1.1频率波数响应函数末尾提到,在代码中我们已经确定了搜索的信号频率,因此仅需要对角度进行扫描,综上所述,代码如下:

%% 目标方位角设置
thetas_deg=60;                 % 目标方位角,度deg
thetas_rad=thetas_deg*deg2rad; % 目标方位角,弧度rad
theta = 0:0.1:180;                  % 任意信号入射角度


%% 频域常规波束形成
tic
for i = 1:length(theta)
    tao = cosd(theta(i))*ra/c;   %在角度theta(i)下得到的时延
    pt_sig = exp(1j*2*pi*f0*tao)' * x.';  %波束,1*LEN
    s_sig(i,:) = pt_sig/N;    %size(s_sig) = i*LEN
end
toc

我们的角度扫描从0到180°,步长为0.1,因此可以得到1801长度的theta,tao为时延补偿,对应中各个阵元的延时补偿。

注意

1. 频率波束响应公式中的转置为共轭转置,在MATLAB中使用单引号,x为输出信号,根据公式不需要转置,这里进行转置主要是为了进行矩阵运算。

2. pt_sig的计算是将每个阵元的对应时延与输出信号相乘得到修正后的信号,然后再相加得到频率响应(频率响应的定义为响应和基函数的卷积累加):

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

如果还是不太明白可以跑出代码后对每个矩阵参数的行列数进行细致观察,从而加深理解。

结果:得到了s_sig,其为i*LEN大小的数据,i为theta的长度。矩阵一列的意义为:每个角度下的频率波数响应;矩阵一行的意义为:同一角度下不同采样点的频率波数响应。

3. 结果展示

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

分析:出现了两个波峰,一个对应60°,一个对应120°,暂且不清楚原因,后续可能会跟进修正,恳请知道原因的朋友赐教,以上。

原因解释:

由于代码基函数部分得到的信号只取了实数部分,后续与修正时延tao的共轭转置相乘时无法通过正交消除120°干扰,如下:

snr=40;               % 信噪比设置
rx=awgn(real(as*s), snr, 'measured');     % 含加性高斯噪声的水听器输出时间波形实数矩阵,Add white Gaussian noise to signal
x = rx.';          % 输出波形矩阵转置,便于二维数组FFT列运算,LEN x N,即接收到的信号

修改代码:

%% 频域常规波束形成
tic
xx = (as*s).';
for i = 1:length(theta)
    tao = cosd(theta(i))*ra/c;   %在角度theta(i)下得到的时延
    pt_sig = exp(1j*2*pi*f0*tao)' * xx.';  %波束,1*LEN
    s_sig(i,:) = pt_sig/N;    %size(s_sig) = i*LEN
end
toc
plot(theta,s_sig(:,1),'b.-');title("频域常规波束形成");  

得到图像:

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

附修改后的MATLAB代码:

clear
close all
clc

% 度与弧度常数
deg2rad = pi/180; % 度转换成弧度
rad2deg = 180/pi; % 弧度转换成度


%% 水听器阵列参数设置
c = 1500;             % 水体声速,米/秒 m/s
N = 70;               % 阵元数
sqrtN=sqrt(N);        % 驾驶向量归一化常数
T=1;                 % 数据时长,秒sec
FS=24e2;              % 采样频率,赫兹Hz
LEN=T*FS;             % 数据长度,点数
t=(0:LEN-1)./FS;      % 数据时间轴,秒sec,1 x LEN 
fc=300;               % 阵列中心频率,赫兹Hz
lambda = c/fc;        % 波长,米m
lambda2 = lambda / 2; % 半波长,米m   d<(lambda/2)?
d = 0.27;             % 阵元间距,米m
ra=d*(0:N-1).';       % 阵元坐标,N x 1   

%% 目标方位角设置
thetas_deg=90;                 % 目标方位角,度deg
thetas_rad=thetas_deg*deg2rad; % 目标方位角,弧度rad
theta = 0:0.1:180;                  % 任意信号入射角度

%% 目标信号生成
f0=300;               % 声源频率,Hz
s=exp(1j*2*pi*f0.*t); % 目标复数信号,1 x LEN  "1j为复数,1为数字一,j为负数"  
as=exp(1j*2*pi*ra*f0*cos(thetas_rad)/c); % 目标驾驶向量,N x 1,驾驶向量=exp(-2*pi*f0*τ*1j*)
snr=40;               % 信噪比设置
rx=awgn(real(as*s), snr, 'measured');     % 含加性高斯噪声的水听器输出时间波形实数矩阵,Add white Gaussian noise to signal
x = rx.';                                 % 输出波形矩阵转置,便于二维数组FFT列运算,LEN x N,即接收到的信号

%% 频域常规波束形成
tic
xx = (as*s).';
for i = 1:length(theta)
    tao = cosd(theta(i))*ra/c;   %在角度theta(i)下得到的时延
    pt_sig = exp(1j*2*pi*f0*tao)' * xx.';  %波束,1*LEN
    s_sig(i,:) = pt_sig/N;    %size(s_sig) = i*LEN
end
toc
figure(1);
subplot(2,1,1);
plot(theta,s_sig(:,1),'b.-');title("频域常规波束形成");  
subplot(2,1,2);
sig_db = 20*log10(abs(s_sig(:,1).^2));
plot(theta,sig_db,'r.-');title("频域常规波束形成——分贝图");  

如果本篇文章对你有帮助,解决了你的疑惑或者问题,请不要吝啬你的点赞哦,谢谢!

4. 添加频域窄带波束形成方法

clear
close all
clc

% 度与弧度常数
deg2rad = pi/180; % 度转换成弧度
rad2deg = 180/pi; % 弧度转换成度


%% 阵列参数设置
c = 1500;             % 水体声速,米/秒 m/s
N = 35;               % 阵元数
sqrtN=sqrt(N);        % 驾驶向量归一化常数
T=1;                 % 数据时长,秒sec
FS=24e3;              % 采样频率,赫兹Hz
LEN=T*FS;             % 数据长度,点数
t=(0:LEN-1)./FS;      % 数据时间轴,秒sec,1 x LEN 
fc=300;               % 阵列中心频率,赫兹Hz
lambda = c/fc;        % 波长,米m
lambda2 = lambda / 2; % 半波长,米m
d = 0.27;             % 阵元间距,米m
ra=d*(0:N-1).';       % 阵元坐标,N x 1

%% 方位角设置
thetas_deg=90;                 % 目标方位角,度deg
thetas_rad=thetas_deg*deg2rad; % 目标方位角,弧度rad

%% 目标信号生成
f0=3000;               % 声源频率,Hz
f1=f0;                % 起始处理频率,Hz
B=10;                 % 处理带宽,Hz
s=exp(1j*2*pi*f0.*t); % 目标复数信号,1 x LEN
sf=fft(s.',LEN);      % 目标信号FFT,LEN x 1
ks=2*pi*f0/c;         % 声源波数,1/m
% 指向目标方位的驾驶向量生成
as=exp(-1j*2*pi*ra*f0*cos(thetas_rad)/c); % 目标驾驶向量,N x 1
rf=sf*(as.');         % 指向目标方向的输出复数信号,LEN x N
% 指向目标方位的输出信号生成
snr=40;               % 信噪比设置
rx=awgn(real(as*s), snr, 'measured');     % 含加性高斯噪声的输出时间波形实数矩阵
x = rx.';                                 % 输出波形矩阵转置,便于二维数组FFT列运算,LEN x N
x_fft = fft(x,LEN);   % 对实信号进行FFT

%% 基础数据
df = FS / LEN;        % 采样分辨率,即某个采样点对应的频率
figure(1);plot((0:LEN-1)*FS / LEN,abs(x_fft(:,1)));  % 测试图像,观察目标信号傅里叶变换:频率为f0 = 300
place = round(f0/df) + 1;    % 获取信号FFT频率对应位置
sig = x_fft(place,:);    % 获取频率为f0信号的FFT结果  1*N   频率有0频
theta_N = 0:0.1:180;  % 角度遍历
ntheta = length(theta_N);


%% 常规频域窄带波束
for i = 1:ntheta
    tao = cos(theta_N(i)*deg2rad)*ra/c;  % 在theta_N(i)角度下的时延  N*1
    A = exp(1j*2*pi*f0*tao);
    B = A' * sig.';    % 常规窄带波束  1*N*N*1
    pt_sig(i) = B;
    power_sig(i) =  B^2;  % 功率
    tt(i) = cosd(theta_N(i));
end

pt_abs = abs(pt_sig);
pt2one = pt_abs ./ max(pt_abs); % 归一化

power_abs = abs(power_sig);
power2one = power_abs ./ max(power_abs);  % 归一化
 
figure(2)
plot(tt,20*log10(pt2one),'r');
% plot(theta_N,(pt2one),'r');
grid on

figure(3)
plot(tt,10*log10(power2one),'b');    % 功率的是10
% plot(theta_N,(power2one),'b');
grid on

 运行结果:

 频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

5. 信噪比提升计算

应评论区要求,增加信噪比提升计算代码。该代码基于时域波束形成,主要的思想是:将添加噪声的信号未添加噪声的信号进行波束形成并计算功率,两者相减得到高斯白噪声的功率。最后使用:

 

得到信噪比。

求得角度遍历下的信噪比最大值对应信号所在的方位。

附代码:

clear
close all
clc
 
% 度与弧度常数
deg2rad = pi/180; % 度转换成弧度
rad2deg = 180/pi; % 弧度转换成度
 
%% 水听器阵列参数设置
c = 1500;             % 水体声速,米/秒 m/s
N = 4;               % 阵元数
sqrtN=sqrt(N);        % 驾驶向量归一化常数
T=1;                 % 数据时长,秒sec
FS=24e2;              % 采样频率,赫兹Hz
LEN=T*FS;             % 数据长度,点数
t=(0:LEN-1)./FS;      % 数据时间轴,秒sec,1 x LEN 
fc=300;               % 阵列中心频率,赫兹Hz
lambda = c/fc;        % 波长,米m
lambda2 = lambda / 2; % 半波长,米m   d<(lambda/2)?
d = 0.27;             % 阵元间距,米m
ra=d*(0:N-1).';       % 阵元坐标,N x 1   
 
%% 目标方位角设置
thetas_deg=90;                 % 目标方位角,度deg
thetas_rad=thetas_deg*deg2rad; % 目标方位角,弧度rad
theta = 0:0.1:180;                  % 任意信号入射角度
 
%% 目标信号生成
f0=300;               % 声源频率,Hz
s=exp(1j*2*pi*f0.*t); % 目标复数信号,1 x LEN  "1j为复数,1为数字一,j为负数"  
as=exp(1j*2*pi*ra*f0*cos(thetas_rad)/c); % 目标驾驶向量,N x 1,驾驶向量=exp(-2*pi*f0*τ*1j*)
snr=-20;               % 信噪比设置
SNR_list = zeros(1,100);
Sig = sum(sum(real(as*s).^2,2)/LEN)/N;  % 信号原始功率

tic
for ii = 1:100  % 进行蒙特卡洛模拟测试
rx=awgn(real(as*s), snr, 'measured');     % 含加性高斯噪声的水听器输出时间波形实数矩阵,Add white Gaussian noise to signal 
%% 常规波束形成——不带噪声数据
% tic
xx = real((as*s).');    % 不带噪声的原始数据
for i = 1:length(theta)
    tao = cosd(theta(i))*ra/c;   %在角度theta(i)下得到的时延
    pt_sig = exp(1j*2*pi*f0*tao)' * xx.';  %波束,1*LEN
    Beamforming(i,:) = pt_sig / N; % i * LEN
    s_sig(i,:) = sum((abs(pt_sig/N)).^2)/LEN;    %size(s_sig) = i*LEN
end
% toc

%% 常规波束形成——带噪声数据
% tic
x = rx.';               % 输出波形矩阵转置,便于二维数组FFT列运算,LEN x N,即接收到的信号
for i = 1:length(theta)
    tao = cosd(theta(i))*ra/c;   %在角度theta(i)下得到的时延
    pt_sig2 = exp(1j*2*pi*f0*tao)' * x.';  %波束,1 * N * N * LEN = 1 * LEN
    s_sig2(i,:) = sum((abs(pt_sig2/N)).^2)/LEN;    % i * 1
end
% toc

N_sig = s_sig2 - s_sig; % 噪声功率
SNR_ = 10*log10(s_sig ./ N_sig); % 通过波束形成后数据求信噪比,SNR = 10*log10(信号功率/噪声功率)
% SNR_ = 10*log10(Sig / N_sig); % 通过原始数据功率求信噪比
% 找最大波束处SNR为增益后的信噪比
SNR_bias = max(SNR_) - snr; % 信噪比的差值
SNR_list(ii) = SNR_bias;
end
toc

% 查看波束图
figure;plot(theta,(abs((Beamforming(:,1)))));title("波束形成图")
Anouncement_ = ['SNR = ', num2str(max(SNR_)),'dB,提升为:', num2str(mean(SNR_list)),'dB'];
disp(Anouncement_)

 运行结果展示:

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

结果分析:

 可以看到,当阵元数N = 4时,SNR提升大概为6dB左右;后将N = 40,再进行计算,得到结果:

频域波束形成与时域波束形成区别,matlab,开发语言,矩阵

可以看到SNR有所提升,符合增加阵列孔径的引起的信号分辨率提升规律。文章来源地址https://www.toymoban.com/news/detail-699461.html

到了这里,关于窄带波束形成——时域与频域常规窄带波束形成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多种波束形成算法的Matlab实现

    多种波束形成算法的Matlab实现 波束形成是一种基于阵列信号处理的技术,它将多个传感器的接收信号进行合理加权,以得到指定方向上的信号增强,具有很高的性能和广泛的应用。在本文中,我们将介绍几种常见的波束形成算法,包括LFMBF、LCMV、LFMCW等,并给出相应的Matlab实

    2024年02月09日
    浏览(39)
  • 自适应波束形成算法及MATLAB仿真算法(RLS和LMS)

    自适应研究的重点一直都是自适应算法,经典的自适应波束形成算法可分为闭环算法(反馈控制算法)和开环算法(也称直接求解方法)。 一般而言, 闭环算法比开环算法要简单,实现方便,但其收敛速率受到系统稳定性要求的限制 。闭环算法包括最小均方(LMS)算法、差

    2024年02月05日
    浏览(48)
  • 基于无线传感器网络的LC-DANSE波束形成算法matlab仿真

    目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1LC-DANSE算法原理 4.2 LCMV算法原理 5.完整程序         在无线传感器网络中,通过MATLAB对比LC-DANSE波束形成算法和LCMV波束形成算法。对比SNR,mse等指标。 MATLAB2022a版本运行        无线传感器网络

    2024年02月20日
    浏览(42)
  • 【老生谈算法】基于matlab时域频域处理的语音信号变声处理系统设计与算法原理(论文+程序源码+GUI图形用户界面)——变声算法

    大家好,今天给大家介绍基于matlab的语音信号变声处理系统设计与算法原理(论文+程序源码)。 运用matlab软件实现对声音的变声处理,利用离散付里叶变换进行频谱分析;设计数字滤波器组;通过时域和频域方法做出各种音效效果,实现变速(慢放、快放),变调(频谱左

    2024年02月04日
    浏览(62)
  • 时序信号的时域、频域、时-频域特征提取

    在面对工业中的传感器采集到的高维的信号,如振动信号,通常需要对数据进行统计特征提取,以进行降维。对于这类时序信号,常用的有时域、频域和时-频域特征提取方法。本次对这三个方面的特征提取代码进行一下总结,并以IEEE PHM 2012 挑战赛的轴承数据集中的Bearing 1

    2024年01月25日
    浏览(37)
  • ADS笔记,时域和频域绘图

    为防止遗忘,记录一下ADS的时间域和频谱图的绘制 在ADS中想得到电路的时域和频域图的话,可以用谐波平衡仿真HB或者选择一个准瞬态仿真控制器插入到原理图中来实现。 然后点击仿真,选择如下 时域设置 得到时域图如下 频域设置 选择幅度谱 得到幅度谱如下 时域设置 这

    2024年02月12日
    浏览(56)
  • 基于FPGA的移相波束形成verilog实现

    欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果

    2023年04月08日
    浏览(39)
  • 一篇文章讲清楚什么是频率、频域、时域

            在1s内完成周期性变化的次数叫做 频率 ,常用f表示。 简单的说是一个周期内能够重复的次数 ,无论是正玄波也好,还是点阵也好,最基本的要求是在一个周期内必须要具备可重复的能力,否则就没办法计算频率,勉强计算的话频率为1Hz;总体来说,频率越高,

    2024年02月11日
    浏览(42)
  • 阵列流形与阵因子的计算及数字波束形成

    由相同阵元构成的天线阵列,其方向图由两部分相乘得到,第一部分是 阵元的方向图 ,只与阵元本身有关;第二部分取决于阵元间的电流比及相位差,与阵元本身无关,称为 阵因子 。不妨令阵列的方向图为 f ( θ , ϕ ) f(theta,phi) f ( θ , ϕ ) ,则有: f ( θ , ϕ ) = f 0 ( θ , ϕ

    2024年02月09日
    浏览(48)
  • 会议音响系统麦克风阵列波束形成算法C语言实现

    一 应用麦克风阵列波束成形算法做的项目产品 二 麦克风波束形成技术应用领域? 麦克风波束形成技术是一种利用多个麦克风阵列来实现声音定向捕捉和增强的技术。通过对多个麦克风信号进行处理和合成,可以使麦克风系统在特定方向上具有更高的灵敏度和抑制非期望方向

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包