zoukankan      html  css  js  c++  java
  • 浅水声信道模型的建立(3)----只考虑海面海底一次散射,多亮点研究

    我貌似前面写的两篇博客里面的理论都是错误的。。。

    程序说明:

    发射信号点为(r=0,z=10,

    亮点1位置为(r1=5000,z1=15;

    接收信号位置为:(rr=0,zz=20:30;

    条件:

    声源发射信号,假设海面与最大深度处,信号只经历一次反射

    整个过程分为三个过程:

    1. 声源到亮点1,得到信号 signal_11(时域)
    2. 在亮点1处散射得到 P1

             R1=conv(P1,signal_11),  R1为散射信号。

        3.散射信号返回到接收信号处,从z=20z=30,10个阵元。假设海面和海底还是经历一次反射,10个阵元接收到10个信号,得到signal_13 (这是一个10行的矩阵,

    每行代表一个阵元)

           Signal_13的每行数据分别和 散射信号R1进行相关,得到一个10行的矩阵

           Zhenlie_1(1:10,:)=conv(signal_13,R1)

       从-90度扫描到90度,进行时域波束形成,得到指向性图,但是可能是距离过远,得到的指向性图不够明显,所以进行加权,得到加权指向性图。

    %==============================================================================================

    首先编写function函数,简化程序的篇幅:

    function receive_signal= Com_Sonar_data_generation_2(c,fs,f0,T,Sample_time,SNR,H,H1,H2,D,Re_coef_surf,Re_coef_bottom,Reflex_num)

    %**********************************通信声呐水听器数据生成函数************************************

    %几点假设:

    %1)基于射线声学理论

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

    %3)考虑水面和水底的反射(浅海声信道?)

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

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

    %***************************************输入参数说明******************************************

    % c                  声速             Unitm/s

    % fs                 采样率           UnitHz

    % f0                 信号频率         UnitHz

    % T                信号脉宽         Units

    % Sample_time        采样时长         Units      假设信号发射的时刻为零时刻

    % SNR                信噪比           UnitdB

    % H                  水深                    Unitm

    % H1                 发射换能器水深           Unitm

    % H2                 接收换能器水深           Unitm

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

    % Re_coef_surf       水面反射系数  

    % Re_coef_bottom     水底反射系数  存在半波损失

    % Reflex_num         考虑最大的反射次数

    %zhenfu              发射信号的振幅

    %phasee              发射信号的相位

    %***************************************输出参数说明******************************************

    % receive_signal     以信号发射为起始采样点的水听器接收信号

    %  receive_signal=[];

    %==================================================

    H1b = H - H1;   %发射换能器到水底的距离       Unitm

    H2b = H - H2;   %接收换能器到水底的距离       Unitm

    Ts = 1/fs;      %采样时间间隔

    sample_num = fix(Sample_time*fs);       %采样总点数 FIX:让x0靠近取整  

    nTs = (0:sample_num-1)/fs;              %离散的采样时刻    

    sample_num1 = fix(T*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;                                 %信号的实际到达时刻     3.3354

    signal_start_time = fix(real_time*fs)+1;              %信号第一个采样点的时刻    53366(应该是说第53366个采样点开始才是到达的时刻的数据)

    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(receive_signal));     %加入噪声

    if Reflex_num>0             %考虑反射时

        for i = 1:Reflex_num    %考虑i次反射的情况

            if mod(i,2) == 0     %偶数次时

    %---------------------------------------------------第一次从水面反射时---------------------------------------------------  

                M = i*H+H1-H2;           %中间系数

                k1 = sqrt(1+(D/M)^2);    %中间系数

                d1 = k1*H1;              %发射换能器距离水面第一个反射点的距离

                d2 = k1*H;               %界面相邻两点间的距离

                d3 = k1*(H-H2);          %水听器距离边界最后一个反射点最近的距离

                di = d1+d2*(i-1)+d3;                                      %反射波总路程

                Si = 1/di*Re_coef_surf^(i/2)*Re_coef_bottom^(i/2);    %反射波的声压幅值

                real_time = di/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)) + Si*sin(2*pi*f0*nTs1 + phase); %模拟采样

    %---------------------------------------------------第一次从水底反射时---------------------------------------------------  

                Mb = i*H+H1b-H2b;         %中间系数

                k1b = sqrt(1+(D/Mb)^2);   %中间系数

                d1b = k1b*H1b;            %发射换能器距离水底第一个反射点的距离

                d2b = k1b*H;              %界面相邻两点间的距离

                d3b = k1b*(H-H2b);        %水听器距离边界最后一个反射点最近的距离

                dib = d1b+d2b*(i-1)+d3b;                                  %反射波总路程

                Sib = 1/dib*Re_coef_surf^(i/2)*Re_coef_bottom^(i/2);  %反射波的声压幅值

                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); %模拟采样

                

            else        %奇数次时

    %---------------------------------------------------第一次从水面反射时---------------------------------------------------  

                M = (i-1)*H+H1+H2;        %中间系数

                k1 = sqrt(1+(D/M)^2);     %中间系数

                d1 = k1*H1;               %发射换能器距离水面第一个反射点的距离

                d2 = k1*H;                %界面相邻两点间的距离

                d3 = k1*H2;               %水听器距离边界最后一个反射点最近的距离

                di = d1+d2*(i-1)+d3;                                                %反射波总路程

                Si = 1/di*Re_coef_surf^((i-1)/2+1)*Re_coef_bottom^((i-1)/2);    %反射波的声压幅值

                real_time = di/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)) + Si*sin(2*pi*f0*nTs1 + phase); %模拟采样

    %---------------------------------------------------第一次从水底反射时---------------------------------------------------  

                Mb = (i-1)*H+H1b+H2b;     %中间系数

                k1b = sqrt(1+(D/Mb)^2);   %中间系数

                d1b = k1b*H1b;            %发射换能器距离水底第一个反射点的距离

                d2b = k1b*H;              %界面相邻两点间的距离

                d3b = k1b*H2b;            %水听器距离边界最后一个反射点最近的距离

                dib = d1b+d2b*(i-1)+d3b;                                             %反射波总路程

                Sib = 1/dib*Re_coef_surf^((i-1)/2)*Re_coef_bottom^((i-1)/2+1);   %反射波的声压幅值

                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); %模拟采样               

            end

        end

    end

     ***************************************************快乐的分割线*****************************************************************************************

    主程序============================================================================================

    clc;close all;clear all;

    % r=0;z=10;%发射信号的位置。 % r1=5000;z1=15;%1号亮点 % r2=5010;z2=15;%2号亮点 % r3=5050;z3=15;%3号亮点 % rr=0;zz=20:30;%接收信号

    c = 1500;            %声速             Unit:m/s

    SNR = 60;            %信噪比           Unit:dB

    H = 100;       %水深                    Unit:m

    %Sample_time = 0.1;   %采样时长         Unit:s      假设信号发射的时刻为零时刻

    Re_coef_surf = -1;      %水面反射系数 

    Re_coef_bottom = 0.8;   %水底反射系数 

    Reflex_num =1;         %考虑最大的反射次数

    %=====================================

    f0=1600;           %信号频率         Unit:Hz

    fs=16000;          %采样率          Unit:Hz      

    T=5/f0;              %信号脉宽         Unit:s %0.0031

    ts=0:1/fs:T-1/fs;   %一个脉冲包络的持续时间序列

    Ns=length(ts);    %50

    startt=0.5;endt=3.5;%混响持续时间

    Sample_time=endt;

    azm=pi/6;

    %============================亮点1===========================================

    %第一过程:发射换能器到亮点1   % r=0;z=10;%发射信号的位置。

    H1 = 10;       %发射点水深           Unit:m

    H2 = 15;       %接收点水深           Unit:m

    D = 5000;       %接收与发射水平距离  Unit:m

    %****************************************************************************

    signal_11=Com_Sonar_data_generation_2(c,fs,f0,T,Sample_time,SNR,H,H1,H2,D,Re_coef_surf,Re_coef_bottom,Reflex_num); signal_11_fft=fft(signal_11);    %56000

    X1=abs(fft(signal_11));

    X1=X1/max(X1);

    figure(1);

    plot(signal_11);

    xlabel('时间s');ylabel('幅度'); string = ['信号发生器—亮点1,信噪比SNR=',num2str(SNR),'dB,考虑的最大反射次数',num2str(Reflex_num),'时域'];title(string);

    figure(2);

    plot(1:length(signal_11_fft),signal_11_fft);

    xlabel('频率omega');ylabel('幅度'); string = ['信号发生器—亮点1,信噪比SNR=',num2str(SNR),'dB,考虑的最大反射次数',num2str(Reflex_num),'频域'];title(string);

    figure(3);

    N=length(signal_11); f=1:N/2;    plot(f,signal_11_fft(1:N/2)); xlabel('频率/Hz');ylabel('归一化幅值');title('频谱的一半');grid on;

    %==========================================================

    %过程2:从亮点散射

    Np=(endt-startt)*fs; %散射系数的点数48000个点,发射信号持续时间内采样的点

    for th=startt:1/fs:endt-1/fs   %混响时间 Np48000个点,th共循环48000次    

    r1=c*(th-T)/2;   %T=0.005    

    r2=c*th/2;     %c=1500    

    N=round((r2^2-r1^2)*azm/2); %azm=0.5236(pi/6)方位角     %随着混响时间的增加,混响点数也在增加    

    ain=randn(1,N);     %幅度    

    fai=randn(1,N)*2*pi;  %相位      

    for i=1:N        

    p1(i)=ain(i)*exp(1i*fai(i));       

    end    

    P1(round((th-startt)*fs)+1)=sum(p1)/r1^2;   %48000

    end

    % 得到混响信号

    R1=conv(signal_11,P1); % length(signal_11)+length(P1)-1;  56000+48000-1=103999 

    Rr1=real(R1);

    figure(4);

    t=startt:1/fs:endt+1240*T-6002/fs;      %: 共103999个点,这个是凑出来的

    plot(t,Rr1/max(Rr1));

    axis([startt endt+1240*T-6002/fs -1 1]);xlabel('时间/s');ylabel('归一化幅值');title('亮点1处--混响');

    %===================================================================

    figure(5);
    R1_fft=fft(R1);
    plot(1:length(R1_fft),R1_fft);
    xlabel('omega/pi');ylabel('归一化幅值|e^j^omega|');title('亮点1处--混响---相关后傅里叶');

    %=====================================================================
    figure(6);
    R1_fft=fft(R1);
    plot(1:length(R1_fft)/2,R1_fft(1:length(R1_fft)/2));
    xlabel('omega/pi');ylabel('归一化幅值|e^j^omega|');title('亮点1处--混响---相关后傅里叶--频谱的一半');


    %=================================================================================

    %重新思考第三过程: %选取阵列第一个点为参考点,zz=20。zz=20:30,rr=0; %亮点1散射后到达阵列1  r1=5000;z1=15;%1号亮点   rr=0;zz=20:30;%接收信号

    H1 = 15;       %发射点水深           Unit:m

    D = 5000;       %接收与发射水平距离  Unit:m

    for kkk=1:10;       %接收点水深           Unit:m        

    H2=20+1*kkk;        

    signal_13(kkk,:)=Com_Sonar_data_generation_2(c,fs,f0,T,Sample_time,SNR,H,H1,H2,D,Re_coef_surf,Re_coef_bottom,Reflex_num);

    end    

    for kkk=1:10    

    zhenlie_1(kkk,:)=conv(signal_13(kkk,:),R1);

    end   

    total_1=zhenlie_1(1,:);

    for kkk=2:10    

    total_1=zhenlie_1(kkk,:)+total_1;

    end

    figure(7);
    plot(1:length(total_1),total_1);
    xlabel('时间‘s');ylabel('幅度');title('阵列接收到的亮点1的信号');


    % ======================================================

    c = 1500;            %声速             Unit:m/s
    D=1;                %阵元的距离
    M = 10;             % 阵元数
    m=[0:M-1];          %阵元序号
    d=0.2;           %系统实孔径0.2
    T=5/f0;              %信号脉宽         Unit:s %0.0031
    k=d/(c*T);
    doa=atan(5/5000);                                          %doa为线阵法线方向与声源的夹角
    w = exp(j*2*pi*k*m'*sin(doa*pi/180));    %每个阵元的时延tow=k*m‘*sin()不同  
    temp=zeros(M,length(total_1));

    for kkk=1:10     temp(kkk,1)=w(kkk,1); end ww=temp*total_1';     

    theta = linspace(-90,90,360);                        % 扫描方位角 a = exp(-j*2*pi*k*m'*sin(theta*pi/180));           %theta是扫描角度% 导向适量

    Y = abs(ww'*a); Y = 20*log10(Y/max(Y)); Y_max=max(Y);

    figure(8);

    plot(theta,Y);

    title('未加权方向图'); axis([-90,90,-50,0]); grid on; xlabel('方位角/(circ)');ylabel( 'P/(dB)');

    %=============================================================

    %加权

    quanzhi=[zeros(1,90) 0.5*ones(1,45) 1*ones(1,90) 0.5*ones(1,45) zeros(1,90)];

    tempp=zeros(360,360);

    for kkk=1:360    

    tempp(1,kkk)=quanzhi(1,kkk);

    end

    YY = abs(Y*tempp);    

    YY = 20*log10(YY/max(YY));

    figure(9);

    plot(theta,YY);

    title('加权方向图'); axis([-90,90,-50,0]); grid on; xlabel('方位角/(circ)');ylabel( 'P/(dB)');

    %============================================================================

    YYY=2.^(3*Y);

    YYY = 20*log10(YYY/max(YYY));

    YYY_max=max(YYY);

    figure(10);

    plot(theta,YYY);

    title('加权方向图'); axis([-90,90,-50,0]); grid on; xlabel('方位角/(circ)');ylabel( 'P/(dB)'); 

    %==========================================================

    然后依次写亮点2和亮点3的程序,然后把得到的total_1,total_2,total_3画在一张图上,得到了

    感觉生无可恋。。。。。。。。

  • 相关阅读:
    PHP深入浅出之命名空间(Namespace)的使用详解
    函数func_get_args详解
    验证码封装类
    PHP中SESSION自定义会话管理器
    网页开发常见问题总结
    mysql远程连接只显示部分数据库问题
    认识和学习bash
    IPv6地址格式示例及IPv6与IPv4的区别分析
    用HTTP核心模块配置一个静态Web服务器
    Nginx服务项的基本配置
  • 原文地址:https://www.cnblogs.com/kiki--xiunai/p/10804549.html
Copyright © 2011-2022 走看看