1.软件版本
MATLAB2013b,quartusii12.1
2.本算法理论知识
波束形成技术来自于基阵有方向性的原理,设一个由N个无方向性阵元组成的接收换能器阵。各阵元位于空间点(xn,yn,zn)处,将所有的阵元相加得到输出,就形成了基阵的自然指向性。此时,若有一远场平面入射波入射到这一基阵上,它的输出幅度将随平面入射角的变化而变化。
当信号源在不同方向时,由于各阵接收信号与基准信号的相位差不同,因而形成的和输出的幅度不同,即阵的响应不同。
表明,一个多元阵输出幅度大小随信号入射角而变化。一般而言,对于一个任意的阵型,无论声波从哪个方向入射,均不可能形成同相相加或得到最大输出,只有直线阵或空间平面阵才会在阵的法线方向形成同相相加,得到最大输出。然而,任意阵型的阵经过适当的处理,可在预定的方向形成同相相加,得到最大输出,这就是波束形成的一般原理。
3.核心代码
`timescale 1ns / 1ps
module tops(
i_clk,
i_rst,
o_index,
o_cos,
o_sin,
o_I_cos,
o_Q_sin,
o_I_filter,
o_Q_filter,
o_I_fft,
o_Q_fft,
o_boxs
);
input i_clk;
input i_rst;
output [15:0] o_index;
output signed[9:0] o_cos;
output signed[9:0] o_sin;
output signed[31:0]o_I_cos;
output signed[31:0]o_Q_sin;
output signed[15:0]o_I_filter;
output signed[15:0]o_Q_filter;
output signed[13:0]o_I_fft;
output signed[13:0]o_Q_fft;
output signed[15:0]o_boxs;
wire signed[9:0]o_signal1 ,o_signal2 ,o_signal3 ,o_signal4 ,o_signal5 ,o_signal6 ,o_signal7 ,o_signal8 ,o_signal9 ,o_signal10;
wire signed[9:0]o_signal11,o_signal12,o_signal13,o_signal14,o_signal15,o_signal16,o_signal17,o_signal18,o_signal19,o_signal20;
wire signed[9:0]o_signal21,o_signal22,o_signal23,o_signal24,o_signal25,o_signal26,o_signal27,o_signal28,o_signal29,o_signal30;
wire signed[9:0]o_signal31,o_signal32,o_signal33,o_signal34,o_signal35,o_signal36,o_signal37,o_signal38,o_signal39,o_signal40;
wire signed[9:0]o_signal41,o_signal42,o_signal43,o_signal44,o_signal45,o_signal46,o_signal47,o_signal48,o_signal49,o_signal50;
Signal Signal_u(
.i_clk (i_clk),
.i_rst (i_rst),
.o_signal1(o_signal1),
.o_signal2(o_signal2),
.o_signal3(o_signal3),
.o_signal4(o_signal4),
.o_signal5(o_signal5),
.o_signal6(o_signal6),
.o_signal7(o_signal7),
.o_signal8(o_signal8),
.o_signal9(o_signal9),
.o_signal10(o_signal10),
.o_signal11(o_signal11),
.o_signal12(o_signal12),
.o_signal13(o_signal13),
.o_signal14(o_signal14),
.o_signal15(o_signal15),
.o_signal16(o_signal16),
.o_signal17(o_signal17),
.o_signal18(o_signal18),
.o_signal19(o_signal19),
.o_signal20(o_signal20),
.o_signal21(o_signal21),
.o_signal22(o_signal22),
.o_signal23(o_signal23),
.o_signal24(o_signal24),
.o_signal25(o_signal25),
.o_signal26(o_signal26),
.o_signal27(o_signal27),
.o_signal28(o_signal28),
.o_signal29(o_signal29),
.o_signal30(o_signal30),
.o_signal31(o_signal31),
.o_signal32(o_signal32),
.o_signal33(o_signal33),
.o_signal34(o_signal34),
.o_signal35(o_signal35),
.o_signal36(o_signal36),
.o_signal37(o_signal37),
.o_signal38(o_signal38),
.o_signal39(o_signal39),
.o_signal40(o_signal40),
.o_signal41(o_signal41),
.o_signal42(o_signal42),
.o_signal43(o_signal43),
.o_signal44(o_signal44),
.o_signal45(o_signal45),
.o_signal46(o_signal46),
.o_signal47(o_signal47),
.o_signal48(o_signal48),
.o_signal49(o_signal49),
.o_signal50(o_signal50),
.o_index (o_index)
);
hunpin hunpin_u(
.i_clk(i_clk),
.i_rst(i_rst),
.i_index(o_index),
.i_signal1(o_signal1) ,
.i_signal2(o_signal2) ,
.i_signal3(o_signal3) ,
.i_signal4(o_signal4) ,
.i_signal5(o_signal5) ,
.i_signal6(o_signal6) ,
.i_signal7(o_signal7) ,
.i_signal8(o_signal8) ,
.i_signal9(o_signal9) ,
.i_signal10(o_signal10),
.i_signal11(o_signal11),
.i_signal12(o_signal12),
.i_signal13(o_signal13),
.i_signal14(o_signal14),
.i_signal15(o_signal15),
.i_signal16(o_signal16),
.i_signal17(o_signal17),
.i_signal18(o_signal18),
.i_signal19(o_signal19),
.i_signal20(o_signal20),
.i_signal21(o_signal21),
.i_signal22(o_signal22),
.i_signal23(o_signal23),
.i_signal24(o_signal24),
.i_signal25(o_signal25),
.i_signal26(o_signal26),
.i_signal27(o_signal27),
.i_signal28(o_signal28),
.i_signal29(o_signal29),
.i_signal30(o_signal30),
.i_signal31(o_signal31),
.i_signal32(o_signal32),
.i_signal33(o_signal33),
.i_signal34(o_signal34),
.i_signal35(o_signal35),
.i_signal36(o_signal36),
.i_signal37(o_signal37),
.i_signal38(o_signal38),
.i_signal39(o_signal39),
.i_signal40(o_signal40),
.i_signal41(o_signal41),
.i_signal42(o_signal42),
.i_signal43(o_signal43),
.i_signal44(o_signal44),
.i_signal45(o_signal45),
.i_signal46(o_signal46),
.i_signal47(o_signal47),
.i_signal48(o_signal48),
.i_signal49(o_signal49),
.i_signal50(o_signal50),
.o_I_cos(o_I_cos),
.o_Q_sin(o_Q_sin),
.o_cos(o_cos),
.o_sin(o_sin)
);
fir_filter fir_filter_real(
.i_clk (i_clk),
.i_rst (i_rst),
.i_din (o_I_cos[15:0]),
.o_dout(o_I_filter)
);
fir_filter fir_filter_imag(
.i_clk (i_clk),
.i_rst (i_rst),
.i_din (o_Q_sin[15:0]),
.o_dout(o_Q_filter)
);
//FFT
reg[11:0]cnt;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
cnt <= 12'd0;
end
else begin
if(cnt == 12'd2000)
cnt <= 12'd2000;
else
cnt <= cnt + 12'd1;
end
end
reg start;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
start <= 1'd0;
end
else begin
if(cnt == 12'd406)
start <= 1'd1;
else
start <= 1'd0;
end
end
fft256 fft256_u(
.CLK (i_clk),
.RST (i_rst),
.ED (1'b1),
.START(start),
.SHIFT(4'b0000),
.DR (o_I_filter[15:6]),
.DI (o_Q_filter[15:6]),
.RDY (),
.OVF1 (),
.OVF2 (),
.ADDR (),
.DOR (o_I_fft),
.DOI (o_Q_fft)
);
//ABS
wire signed[23:0]tmps;
assign tmps = o_I_fft*o_I_fft+o_Q_fft*o_Q_fft;
assign o_boxs = tmps[17:2];
endmodule
clc
clear
close all;
%分析一:天线的角分辨率(能探测角度的精度)
Err = [];
for i = 0:60
N = 32;
d = 0.5;
lamada = 2*d;
theta = -pi/2:pi/720:pi/2;
fai = 2*pi/lamada*d*sin(theta);
k = 0:N-1;
S = exp(1j*k'*fai);
theta_yi0= i;
theta_yi = theta_yi0*pi/180;
r = round(N*d/lamada*sin(theta_yi))+1;
Ar = fft(S,32);
[VV,II] = max(abs(Ar(r,:)));
JIAODU = abs(theta(II)*180/pi);
figure(1);
plot(theta*180/pi,abs(Ar(r,:)));
Err = [Err,abs(JIAODU-theta_yi0)];
end
figure;
plot(0:60,Err,'b-o');
%分析二:提高信噪比
Err = [];
SNR_SET = [-20:10];
for SNR = SNR_SET
N = 32;
d = 0.5;
lamada = 2*d;
theta = -pi/2:pi/720:pi/2;
fai = 2*pi/lamada*d*sin(theta);
k = 0:N-1;
S = exp(1j*k'*fai);
S = awgn(S,SNR,'measured');
theta_yi0= 45;
theta_yi = theta_yi0*pi/180;
r = round(N*d/lamada*sin(theta_yi))+1;
Ar = fft(S,32);
[VV,II] = max(abs(Ar(r,:)));
JIAODU = abs(theta(II)*180/pi);
figure(1);
plot(theta*180/pi,abs(Ar(r,:)));
Err = [Err,abs(JIAODU-theta_yi0)];
end
figure;
plot(SNR_SET,Err,'b-o');
%分析三:天线能够探测的角度范围
Err = [];
for i = 0:80
N = 32;
d = 0.5;
lamada = 2*d;
theta = -pi/2:pi/720:pi/2;
fai = 2*pi/lamada*d*sin(theta);
k = 0:N-1;
S = exp(1j*k'*fai);
theta_yi0= i;
theta_yi = theta_yi0*pi/180;
r = round(N*d/lamada*sin(theta_yi))+1;
Ar = fft(S,32);
[VV,II] = max(abs(Ar(r,:)));
JIAODU = abs(theta(II)*180/pi);
figure(1);
plot(theta*180/pi,abs(Ar(r,:)));
Err = [Err,abs(JIAODU-theta_yi0)];
end
figure;
plot(0:80,Err,'b-o');
4.操作步骤与仿真结论
这里,这个波形,仿真效果如下所示:
在fpga中,仿真结果如下所示:
因为FFT之后,他会自动出现两个峰值,。修改后仿真结果如下所示:
5.参考文献
A21-10
版权声明:本文为ccsss22原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。