jjzjj

【Matlab】海底声学模拟(Bellhop)以及滤波器的设计

学测绘的小杨 2023-09-23 原文

一、设计要求

  某单波束测深仪最大测量水深为300米,请根据《水声学原理》和《数字信号处理》相关知识,仿真设计该单波束测深仪的数字信号处理系统(包括模拟滤波器参数、采样频率、量化精度等工作参数;FIR/IIR滤波器设计,并对数字信号进行:匹配滤波;底检测;底跟踪和声呐图绘制等处理)。

(PS:需要全部代码文件文件请点击这里,需要Bellhop使用说明书请点击这里。)

二、采样数据模拟生成

1.理想条件下声呐采样波形生成

1.1假设出的理想条件:

(1)基于射线声学理论

(2)几何衰减按球面波传播衰减规律衰减,不考虑吸收衰减

(3)仅考虑水底的反射

(4)考虑在高斯白噪声背景下

(5)整个空间声速分布均匀

1.2在假设信号发射的时刻为零时刻的前提下,输入的参数说明

1 输入参数说明

C=1500

声速

单位:m/s

f0=15e3

信号频率

单位:Hz

fs=f0*10

采样率,最高频率的5

单位:Hz

Tao=5/f0

信号脉宽

单位:s

Sample_time=0.1

采样时长

单位:s

SNR=60

信噪比

单位:dB

H=10

水深

单位:m

H1=5

发射换能器水深

单位:m

H2=5

接收换能器水深

单位:m

D=1

接收与发射换能器水平距离

单位:m

Re_coef_bottom

水底反射系数

单位:无

1.3生成发射信号并模拟反射环境

data_generation.m

function receive_signal = data_generation(c,fs,f0,Tao,Sample_time,SNR,H,H1,H2,D,Re_coef_bottom)
%**********************************通信声呐水听器数据生成函数************************************
%几点假设:
%(1)基于射线声学理论
%(2)几何衰减按球面波传播衰减规律衰减,不考虑吸收衰减
%(3)仅考虑水底的反射
%(4)考虑在高斯白噪声背景下
%(5)整个空间声速分布均匀
%***************************************输入参数说明******************************************
% c                  声速             Unit:m/s
% fs                 采样率           Unit:Hz
% f0                 信号频率         Unit:Hz
% Tao                信号脉宽         Unit:s
% Sample_time        采样时长         Unit:s      假设信号发射的时刻为零时刻
% SNR                信噪比           Unit:dB
% H                  水深                    Unit:m
% H1                 发射换能器水深           Unit:m
% H2                 接收换能器水深           Unit:m
% D                  接收与发射换能器水平距离  Unit:m
% Re_coef_bottom     水底反射系数  存在半波损失
Ts = 1/fs;      %采样时间间隔
sample_num = fix(Sample_time*fs);       %采样总点数
nTs = (0:sample_num-1)/fs;              %离散的采样时刻
sample_num1 = fix(Tao*fs);              %信号的采样点数
nTs1 = (0:sample_num1-1)/fs;            %信号的离散的采样时刻
receive_signal = zeros(size(nTs));      %用于存储水听器接收的信号
d0 = sqrt((H1-H2)^2+D^2);     %两个换能器的直线距离
S0 = 1/d0;                    %直达波的声压幅值
Noise_var = 10^(-SNR/20)*S0;  %白噪声的方差
%% 计算到达回波信号
real_time = d0/c;                                     %信号的实际到达时刻
signal_start_time = fix(real_time*fs)+1;              %信号第一个采样点的时刻
phase = (signal_start_time*Ts-real_time)/Ts*2*pi;     %得到信号的第一个采样点的相位 
receive_signal(signal_start_time:(signal_start_time+sample_num1-1)) = S0*sin(2*pi*f0*nTs1+phase); %模拟采样
receive_signal = receive_signal + Noise_var*randn(size(nTs));     %加入噪声
M=power(D/(2*H-H1-H2),2);
d1=sqrt(M+1)*(H-H1);
d2=sqrt(M+1)*(H-H2);
dib=  d1+d2  %反射波总路程
Sib=1/dib*Re_coef_bottom;   %反射波的声压幅值
real_time = dib/c;                                                   %信号的实际到达时刻
signal_start_time = fix(real_time*fs)+1;                             %信号第一个采样点的时刻
phase = (signal_start_time*Ts-real_time)/Ts*2*pi;                    %得到信号的第一个采样点的相位 
receive_signal(signal_start_time:(signal_start_time+sample_num1-1)) =...
receive_signal(signal_start_time:(signal_start_time+sample_num1-1)) + Sib*sin(2*pi*f0*nTs1 + phase); %模拟采样                  
receive_signal = receive_signal/S0;    %将直达波的幅值归一化

调用上述函数,主运行函数(test.m)

close all;
clear all;
clc;
c = 1500;            %声速             Unit:m/s
f0 = 15e3;           %信号频率         Unit:Hz
fs = f0*10;          %采样率 最高频率的5倍   Unit:Hz
Tao = 5/f0;         %信号脉宽         Unit:s
Sample_time = 0.1;   %采样时长         Unit:s      假设信号发射的时刻为零时刻
SNR = 40;            %信噪比           Unit:dB
H = 10;       %水深                    Unit:m
H1 = 5;       %发射换能器水深           Unit:m
H2 = 5;       %接收换能器水深           Unit:m
D = 1;       %接收与发射换能器水平距离  Unit:m
Re_coef_bottom = 1;   %水底反射系数  
%%
sample_num = fix(Sample_time*fs);       %采样总点数
nTs = (0:sample_num-1)/fs;              %离散的采样时刻
%生成水听器接收数据
receive_signal0 =data_generation(c,fs,f0,Tao,Sample_time,SNR,H,H1,H2,D,Re_coef_bottom);
figure;
plot(nTs,receive_signal0);
xlabel('时间s');
ylabel('幅度');
string = ['水听器接收的仿真数据,信噪比SNR=',num2str(SNR),'dB'];
title(string);

运行后得到图像:

  得到理想情况下的仿真数据。

2.Bellhop射线模型与参数设计

2.1Bellhop模型的介绍:

  BELLHOP 模型是通过高斯波束跟踪方法(Porter 和 Bueker,1987 年),计算 水平非均匀环境中的声场。高斯波束跟踪方法对于高频水平变化问题特别有吸 引力,这是简正波、波数积分和抛物线模型不可替代的。高斯束射线跟踪法的基 本思想是将高斯强度分布与每条声线联系起来,该声线为高斯声束的中心声线, 这些声线能较平滑的过渡到声影区,也能较平滑的穿过焦散线,所提供的结果与 全波动模型的结果更为一致。

2.2Bellhop模型的使用:

(1)确定env文件。

  具体操作请参考Bellhop使用说明书。

(2)设计程序

  设计程序实现任意信号输入,实现接收信号的Bellhop模型模拟。

  bharr2ir.m

function ir_vec=bharr2ir(delay, amp, sampling_rate)

valid_delay_index=find(delay>0);
if isempty(valid_delay_index)
    disp('[bharr2ir]Error: Zero path simulated by BELLHOP.');
    return;
end
delay_vec=delay(valid_delay_index);
amp_vec=amp(valid_delay_index);

%单位冲激响应进行采样
delay_min=min(delay_vec);
delay_max=max(delay_vec);

cir_length=round(delay_max*sampling_rate);
ir_vec=zeros(cir_length, 1);

%find individual ray paths
for icn=1: length(delay_vec)
    %calculate the arrival index
    %init_delay gives some zeros priror to the first path
    arr_id=round(delay_vec(icn)*sampling_rate);
    
    %generate impulse response. Note that sometime, multiple returns can be
    %generate for the same delay in BELLHOP. 
    ir_vec(arr_id)=ir_vec(arr_id)+amp_vec(icn);
end

 ambientnoise_psd.m

function [npsd_db]=ambientnoise_psd(windspeed, fc)
%考虑海洋湍流和风力

%Turbulance noise湍流噪声
ANturb_dB=17-30*log10(fc/1000);

%Ambient noise in dB (wind driven noise)
ANwind_dB=50+7.5*sqrt(windspeed)+20*log10(fc/1000)-40*log10(fc/1000+0.4);

%Thermo noise in dB (wind driven noise)热噪声
ANthermo_dB=-15+20*log10(fc/1000);

%Total noise PSD
npsd_db=10*log10(10^(ANturb_dB/10)+10^(ANwind_dB/10)+10^(ANthermo_dB/10));

signal_mf.m

function est_ir_vec=signal_mf(rx_signal, tx_source, cir_length)

ttl_samples=length(tx_source);

%generate matched-filter from the source signal
txsig_flip=conj(tx_source(end:-1:1));

%matched-filtering
%division by ttl_samples is necessary for normalization
est_ir_vec=conv(txsig_flip, rx_signal)/ttl_samples;

 uw_isi.m

function [y, adj_ir_vec]=uw_isi(ir_vec, sl_db, tx_source, nv_db)
%与单位冲激响应函数卷积并加入噪声
%发送信号与信道冲激响应进行卷积
tx_sig=conv(tx_source, ir_vec);

%接收信号信噪比
SNR=sl_db-nv_db;

%信道输出
y=awgn(tx_sig,SNR);
adj_ir_vec=ir_vec;

 Bellohop.m

function[rx_signal,Ts]=Bellohop()%rx_signal信号序列 fs采样频率
clear; close all; clc; 

%采样率
sampling_rate=2000e3;

%发射机中心频率
%该值和计算噪声有关
fc=200e3;
windspeed=5;

radio=sampling_rate/fc  %采样率与中心频率的比值
%发射机参数
sl_db=200;  %发射机声源级
bw=8e3;     %带宽

%通过Actup的arr文件获取所需的幅值和时延(单位冲激响应)
%BELLHOP run ID
env_id='env';
%read BELLHOP arr file:
[ amp1, delay1, SrcAngle, RcvrAngle, NumTopBnc, NumBotBnc, narrmat, Pos ] ...
    = read_arrivals_asc( [env_id '.arr'] ) ;
[m,n]=size(amp1);
amp=amp1(m,:);
delay=delay1(m,:);

%Step 1: 创建任意波形(这里以正弦波为例)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
F_Serial_Signal=[zeros(1,1),ones(1,1),zeros(1,10)];  %待发送串行数据
Signal_L=length(F_Serial_Signal);                    %发送数据长度
communication_rate=40e3;                       %通信速率 
Communication_radio= sampling_rate/communication_rate; %采样倍数
signal=repmat(F_Serial_Signal,Communication_radio,1);
signal2=reshape(signal,1,Signal_L*Communication_radio);      %调整后的数据
signal_length=length(signal2);                 %数据长度
t=0:1/sampling_rate:(signal_length-1)/sampling_rate;      %时间
modulation_signal=cos(2*pi()*fc*t); %载波信号
          


tx_source=signal2.*modulation_signal;          %发送

%Step 2:加入噪声和多径影响
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Narrmx=10; %limit ourselves to use the first Narrmax paths

%对单位冲激响应进行采样
ir_vec=bharr2ir(delay, amp, sampling_rate);
%strongest tap in dB
maxamp_db=20*log10(max(abs(amp)))+sl_db;%声源级(dB)加由于信道衰减的能量(dB),表示接收到的信号的能量

%噪声级
[npsd_db]=ambientnoise_psd(windspeed, fc);%npsd_db是噪声的能量谱密度(单位频带内的能量)转换成dB,
nv_db=npsd_db+10*log10(bw);%相当于能量谱密度乘以带宽,即该频带内的噪声的能量
% maxamp_db和nv_db的差值应该为信噪比
disp(['Strongest tap strength=' num2str(maxamp_db,'%.1f') ' dB; Noise variance=' num2str(nv_db,'%.1f') 'dB']);

%考虑多径和噪声影响后的接收信号响应
[rx_signal, adj_ir_vec]=uw_isi(ir_vec, maxamp_db, tx_source, nv_db);

Ts=1/sampling_rate;

t2=0:Ts:(length(rx_signal)-1)*Ts;

figure(1)
subplot(2,1,1)
plot(t,tx_source)
title('发送信号')
xlabel('时间/s')
ylabel('幅值(V)')
set(gca, 'Fontsize', 16);

subplot(2,1,2)
plot(t2,rx_signal)

title('接收到的信号')
xlabel('时间/s')
ylabel('幅值(V)')
set(gca, 'Fontsize', 16);
end

效果实现如下:

2.3绘制冲激响应图

 plotting.m

clear
clc
filename = 'env.arr';
Minimum_range=100  %(接收水听器的水平方向上接收范围最小值,m)----R 
Maximum_range=1000 %(接收水听器的水平方向上接收范围最大值,m)---RB 

[ amp1, delay, SrcAngle, RcvrAngle, NumTopBnc, NumBotBnc, narrmat, Pos ]... 
 = read_arrivals_asc(  filename );
%%单位冲激响应
[m,n]=size(amp1);
amp = abs(amp1); %取模  
x = delay(m,:); %获取第50个接收机的时延和幅值
y = amp(m,:);
figure(1)
stem(x,y)
grid on
xlabel('相对时延/s')
ylabel('幅度')
title('单位冲激响应')

%%归一化冲激响应
Amp_Delay = [x;y];
Amp_Delay(:,all(Amp_Delay==0,1))=[]; %去掉0值
Amp_Delay=sortrows(Amp_Delay',1);  %按照时延从小到大排序
normDelay = Amp_Delay(:,1)-Amp_Delay(1,1);%归一化时延
normAmp = Amp_Delay(:,2)/Amp_Delay(1,2);%归一化幅度
figure(2)
stem(normDelay,normAmp,'^')
grid on
xlabel('相对时延/s')
ylabel('归一化幅度')
title('归一化冲激响应')

figure(3)
mum=1:m;
ReRange = Minimum_range+(Maximum_range-Minimum_range)/m*mum;
for i=1:min(narrmat)
plot(delay(:,i),ReRange,'o')
hold on
end
hold off
grid on
colorbar
xlabel('时延(sec)')
ylabel('Range(m)')
title(filename)

生成结果如下:

三.滤波器设计方案

对于本次问题采样IIR滤波器:

切比雪夫Ⅱ型滤波器,种类为带通滤波器

Fstop1=180KHz

Fpass1=190KHz

Fpass2=210KHz

Fstop2=220KHz

Astop1=90

Apass=1

Astop2=90

阶:22阶

节:11

稳定滤波幅值响应

FS:采样频率为2000KHz

滤波器的幅值响应图像:

 滤波器设计代码如下:

function Hd = filter_2nd
%FILTER_2ND 返回离散时间滤波器对象。
% MATLAB Code
% Generated by MATLAB(R) 9.11 and DSP System Toolbox 9.13.
% Generated on: 14-Dec-2022 16:14:37
% Chebyshev Type II Bandpass filter designed using FDESIGN.BANDPASS.
% All frequency values are in kHz.
Fs = 2000;  % Sampling Frequency
Fstop1 = 180;         % First Stopband Frequency
Fpass1 = 190;         % First Passband Frequency
Fpass2 = 210;         % Second Passband Frequency
Fstop2 = 220;         % Second Stopband Frequency
Astop1 = 90;          % First Stopband Attenuation (dB)
Apass  = 1;           % Passband Ripple (dB)
Astop2 = 90;          % Second Stopband Attenuation (dB)
match  = 'stopband';  % Band to match exactly
% Construct an FDESIGN object and call its CHEBY2 method.
h  = fdesign.bandpass(Fstop1, Fpass1, Fpass2, Fstop2, Astop1, Apass, ...
                      Astop2, Fs);
Hd = design(h, 'cheby2', 'MatchExactly', match);

% [EOF]

 滤波后结果如图:

 学习不易,转载请联系博主。

有关【Matlab】海底声学模拟(Bellhop)以及滤波器的设计的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  3. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  8. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  9. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  10. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

随机推荐