一、FMCW波
調(diào)頻連續(xù)波(frequency modulated continuous wave, FMCW),常用于雷達(dá)中進(jìn)行距離檢測,其所用到的信號是一種頻率隨調(diào)制信號線性增長的調(diào)頻波,還可用于電纜的故障定位。本文基于電纜的故障定位這個(gè)方向,簡單介紹FMCW波的產(chǎn)生,也是對最近學(xué)習(xí)的一個(gè)記錄和總結(jié)。
由角調(diào)信號出發(fā),其一般表達(dá)式為

其中,A是振幅,
?是信號的瞬時(shí)相位,
?是瞬時(shí)相位偏移(相對于?
?),
?是信號的瞬時(shí)角頻率,
?是信號的瞬時(shí)角頻偏(相對于?
?),除個(gè)2
就從角頻率變?yōu)轭l率。
對于調(diào)頻信號,就是瞬時(shí)頻率偏移隨調(diào)制信號m(t)成比例變化,即

其中Kf為調(diào)頻靈敏度,單位是rad/s*V,此時(shí)瞬時(shí)相位偏移就是

代入角調(diào)信號的一般表達(dá)式可得調(diào)頻信號的一般表達(dá)式為

上面提到FMCW用的信號是頻率隨調(diào)制信號線性增長的調(diào)頻波,既然是調(diào)頻波,頻率又是線性增長,則可以理解為瞬時(shí)頻率偏移線性增長,即

其中K是斜率,則此時(shí)瞬時(shí)相位偏移就是

于是便可得到線性調(diào)頻連續(xù)波的表達(dá)式為

將
看作是?
?的話,可以看出其頻率從fc開始以K/2的斜率線性增加。
對于FMCW雷達(dá)測距更加詳細(xì)的原理請看:
調(diào)頻連續(xù)波(FMCW)雷達(dá)測距、測速詳解-CSDN博客
如果假設(shè)發(fā)射信號Si為

則其頻率為

發(fā)射信號進(jìn)入電纜中碰到故障位置會(huì)發(fā)生反射,則接收信號Sr為

其中
為時(shí)延,則其頻率為

若將接收信號和發(fā)射信號進(jìn)行混頻,濾波,可以得到一個(gè)它們之間的一個(gè)頻率差,為

也就是說發(fā)射信號和接收信號混合后會(huì)產(chǎn)生一個(gè)頻率為
的信號。也可以將Si與Sr的三角表達(dá)式進(jìn)行相乘(混頻),也能得到一個(gè)頻率為
的信號。
又由于對于線性調(diào)頻信號,

其中fb是頻率差,
為時(shí)延,B為帶寬,T為調(diào)制周期,并且

其中D是故障點(diǎn)距發(fā)射點(diǎn)的距離,由于反射,故距離為2D,v是信號在電纜中的傳播速度,則結(jié)合上述式子,可以得到故障點(diǎn)的距離為

也就是說,只要得到頻率差fb和傳播速度v就能得到故障點(diǎn)的距離D。
二、matlab產(chǎn)生FMCW波
設(shè)置的參數(shù)有調(diào)制周期Ts為1ms,帶寬Bw為50MHz,起始頻率fc為25MHz,采樣頻率fs為200MHz,則斜率tao為Bw/Ts。
clear;clc;
Ts = 0.001; %調(diào)制周期1ms
Bw = 50e6; %帶寬50MHZ
fc=25e6; %起始頻率25MHz
tao = Bw/Ts; % 斜率 50HZ/ns 250HZ/5ns fc+tao*t =>(積分) fc*t+(tao/2)*t^2
fs = 4*Bw; %采樣頻率
dt = 1/fs; %采樣間隔
N = Ts/dt; %一個(gè)周期的采樣點(diǎn)數(shù)
t = 0Ts-dt; %時(shí)間序列
Am=1; % 信號幅度
SFM=Am*cos(2*pi*(fc+(tao/2)*t).*t); %發(fā)射信號
figure(1); % 繪制第一幅圖
subplot(211); % 窗口分割,將一幅圖分割成2*2的
plot(t,SFM,'Linewidth',2); % 時(shí)間t為橫坐標(biāo),基帶信號SFM為縱坐標(biāo)繪圖,線寬為2
xlabel('t/時(shí)間'); % 橫坐標(biāo)標(biāo)注
ylabel('幅度'); % 縱坐標(biāo)標(biāo)注
title('發(fā)射信號'); % 圖標(biāo)題標(biāo)注
axis([10e-4*Ts*100,10e-4*Ts*101,-1.1,1.1]); % 橫縱坐標(biāo)范圍設(shè)置
line([10e-4*Ts*100,10e-4*Ts*101],[0,0],'color','b','Linewidth',2);% 繪制一條從(0,0)到(0.1,0)的藍(lán)色實(shí)線,線寬為2
subplot(212);
[mf,msf]=T2F(t,SFM); % 傅里葉變換,得到縱坐標(biāo)頻譜和橫坐標(biāo)頻率
subplot(212);
plot(mf,abs(msf),'Linewidth',1); % 畫出SFM信號頻譜 頻譜以fm為間隔
title('發(fā)射信號的頻譜'); % 圖標(biāo)題標(biāo)注
xlabel('f/Hz'); % 橫坐標(biāo)標(biāo)注
ylabel('幅度/H(f)'); % 縱坐標(biāo)標(biāo)注
t1=1e-6; %時(shí)延 1us d=c/2t1=150m
SFM1=Am*cos(2*pi*(fc+(tao/2)*(t-t1)).*(t-t1)); %接收信號
Fb=SFM.*SFM1; %混頻
[b,a]=butter(6,fc/(fs/2)); %巴特沃斯濾波器參數(shù)
Xb=filter(b,a,Fb); %濾波 tao*t1的中頻頻率
figure(2); % 繪制第二幅圖
subplot(211); % 窗口分割,將一幅圖分割成2*1的
plot(t,Xb,'Linewidth',2);
title('接收混頻信號'); % 圖標(biāo)題標(biāo)注
xlabel('t/時(shí)間'); % 橫坐標(biāo)標(biāo)注
ylabel('幅度'); % 縱坐標(biāo)標(biāo)注
axis([0,Ts*0.5,-1.1,1.1]); % 橫縱坐標(biāo)范圍設(shè)置
[mf2,msf2]=T2F(t,Xb); % 傅里葉變換,得到縱坐標(biāo)頻譜和橫坐標(biāo)頻率
subplot(212);
plot(mf2,real(msf2),'Linewidth',1); % 畫出AM信號頻譜 頻譜以fm為間隔
title('混頻信號的頻譜'); % 圖標(biāo)題標(biāo)注
xlabel('f/Hz'); % 橫坐標(biāo)標(biāo)注
ylabel('幅度/H(f)'); % 縱坐標(biāo)標(biāo)注
d=(3e8*Ts*tao*t1)/(2*Bw); %距離計(jì)算
fprintf('距離為:%d米 ',d);
function [f,sf]= T2F(t,st) % FFT
% dt = t(2)-t(1);
T=t(end); % 輸入信號的時(shí)間最大值為T
df = 1/T; % dt=1/fs; 時(shí)間采樣間隔,采樣頻率的倒數(shù);
% N=T/dt; 采樣點(diǎn)個(gè)數(shù),總時(shí)長除以采樣間隔
% 兩式聯(lián)合推導(dǎo) df = 1/T
N = length(st); % 輸入信號時(shí)間的長度為采樣點(diǎn)數(shù)
f=-N/2*df : df : N/2 * df-df; % 頻率分布
sf = fft(st); % 做FFT
sf = T/N * fftshift(sf); % 最后輸出,將0-fs頻譜搬移到-fs/2-fs/2頻譜
發(fā)射信號的波形圖如下,只看了一小部分,實(shí)際上觀看同樣長度,不同時(shí)間頻率是變化的。

發(fā)射信號頻譜圖如下,可以看到其頻率范圍為25MHz至75MHz

混頻濾波之后的信號如下,從其頻譜圖可以看到產(chǎn)生了一個(gè)50000Hz的信號,由于時(shí)延t1設(shè)置為1us,頻率差tao*t1也是為50000

假設(shè)信號在電纜中以光速傳播,即v=300000000m/s,則可以計(jì)算得到距離D為150m。并且假設(shè)雷達(dá)信號在空氣中以光速傳播,則1us后接收到信號,實(shí)際是雷達(dá)信號傳播了300m,即在150m處反射??梢哉f明上述的公式推導(dǎo)正確。
三、FPGA產(chǎn)生FMCW波
要在FPGA中去產(chǎn)生FMCW波需要用到DDS IP核。利用其頻率控制字去控制DDS產(chǎn)生頻率線性增長的波。本文利用vivado軟件,Verilog語言進(jìn)行仿真產(chǎn)生波形數(shù)據(jù),再將數(shù)據(jù)導(dǎo)入matlab中進(jìn)行校驗(yàn)。選取的板塊時(shí)鐘頻率為200MHz,即5ns一個(gè)數(shù)據(jù)。
下面是DDS IP核的簡單配置,更加詳細(xì)的配置可以參考其他文章。第一個(gè)界面中將參數(shù)選擇設(shè)置為硬件參數(shù),在相位位寬處可以設(shè)置需要的位寬,這里是32位。位寬數(shù)用于計(jì)數(shù)頻率控制字。

第二個(gè)頁面將相位的增加形式設(shè)置為Streaming,可以在代碼中去控制輸入的相位數(shù)據(jù)改變頻率,適合產(chǎn)生調(diào)頻信號。

后續(xù)都保持默認(rèn)就行。

對于DDS的輸出頻率有計(jì)算公式

其中fclk為時(shí)鐘頻率,k為相位控制字,也就是輸入的相位數(shù)據(jù),N為相位位寬。按照上述matlab中的參數(shù),要想fc為25MHz,則

也就是頻率控制字起始為536870912。并且由于調(diào)制周期是1ms,時(shí)鐘頻率為200MHz,即1ms有200000個(gè)數(shù)據(jù),帶寬為50MHz,即每個(gè)數(shù)據(jù)增加250Hz,也就是步長為250Hz,則

也就是每個(gè)時(shí)鐘周期頻率控制字增加5369。
//產(chǎn)生連續(xù)的線性調(diào)頻信號,200MHz時(shí)鐘,1ms調(diào)制周期,25MHz起始頻率,帶寬50MHz,步長(一個(gè)時(shí)鐘周期5ns增加)250Hz
//32位,fout=fclk*K/2^32,K位相位控制字,則起始頻率K=536870912,步長K=5369
module Gen_LFM
#(
parameter CNT_TAO_MAX = 32'd199999 //1ms計(jì)數(shù)值
)
(
input wire sys_clk,
input wire sys_rst_n,
input wire ctl_tao, //開始信號
output wire [16-1:0]data_out
);
reg [18-1:0]cnt_tao; //1ms計(jì)數(shù)器
reg tao_en;
reg tao_en_d1;
reg [32-1:0]dds_pinc_in;
wire [32-1:0]s_axis_phase_tdata;
parameter FREQ_START = 32'd536870912; //起始頻率為25MHz
parameter FREQ_STEP = 32'd5369; //步進(jìn)頻率為250Hz
wire [32-1:0] data;
wire [16-1:0]sin_imag;
wire [16-1:0]cos_real;
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0) begin
tao_en <= 1'b0;
end
else begin
if (ctl_tao == 1'b1) begin
tao_en <= 1'b1;
end
end
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0) begin
tao_en_d1 <= 1'b0;
end
else begin
tao_en_d1 <= tao_en; ?// 延遲一個(gè)時(shí)鐘周期
end
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0) begin
cnt_tao <= 18'd0;
end
else if (tao_en == 1'b1) begin
if (cnt_tao == CNT_TAO_MAX) begin
cnt_tao <= 18'd0;
tao_en <= 1'b0;
end
else begin
cnt_tao <= cnt_tao + 1'b1;
end
end
end
//頻率控制字
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0) begin
dds_pinc_in <= FREQ_START;
end
else begin
if (tao_en == 1'b1) begin
dds_pinc_in <= dds_pinc_in + FREQ_STEP;
end
else if (tao_en == 1'b0 && tao_en_d1 == 1'b1) begin
dds_pinc_in <= FREQ_START;
end
end
end
assign s_axis_phase_tdata=dds_pinc_in;
dds dds_inst (
.aclk(sys_clk), // input wire aclk
.aclken(tao_en), // input wire aclken
.s_axis_phase_tvalid(tao_en), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(s_axis_phase_tdata), // input wire [63 : 0] s_axis_phase_tdata
.m_axis_data_tvalid(), // output wire m_axis_data_tvalid
.m_axis_data_tdata(data), // output wire [15 : 0] m_axis_data_tdata
.m_axis_phase_tvalid(), // output wire m_axis_phase_tvalid
.m_axis_phase_tdata() // output wire [31 : 0] m_axis_phase_tdata
);
assign sin_imag = data[31:16];
assign cos_real = data[15:0]+4096 ;
//將數(shù)據(jù)導(dǎo)出為txt
integer real_out_file;
initial
begin
real_out_file = $fopen("D:/FMCW/FM/cos_real.txt","w");//定義需要保存的路徑和文件名
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if(tao_en)begin
$fdisplay(real_out_file,"%b",cos_real);//將數(shù)據(jù)保存為二進(jìn)制
end
else if (tao_en == 1'b0 && tao_en_d1 == 1'b1) begin
$fclose(real_out_file);
end
end
endmodule
在vivado的仿真圖中可以看到輸出的頻率是逐漸增加的,并且在1ms后頻率又回到25MHz。


將導(dǎo)出的數(shù)據(jù)用matlab讀取
clear;clc;
Bw = 50e6;
Ts = 0.001;
c=3e8;
fileID = fopen('cos_real.txt', 'r');
% 讀取整個(gè)文件內(nèi)容為字符串
file_content = fscanf(fileID, '%c');
% 關(guān)閉文件
fclose(fileID);
% 移除所有非二進(jìn)制字符(如換行符、空格等)
file_content = regexprep(file_content, '[^01]', '');
% 設(shè)置二進(jìn)制位數(shù)(例如8位表示一個(gè)字節(jié))
bits_per_number = 16;
% 計(jì)算可轉(zhuǎn)換的完整二進(jìn)制數(shù)數(shù)量
num_numbers = floor(length(file_content) / bits_per_number);
% 初始化結(jié)果數(shù)組
decimal_values = zeros(num_numbers, 1);
% 逐塊轉(zhuǎn)換
for i = 1:num_numbers
% 提取固定位數(shù)的二進(jìn)制字符串
binary_str = file_content((i-1)*bits_per_number+1 : i*bits_per_number);
% 轉(zhuǎn)換為十進(jìn)制
decimal_values(i) = bin2dec(binary_str);
end
SFM=(decimal_values-4096)./2048;
SFM1 = [SFM(end-199:end); SFM(1:end-200)]; % 延遲1us(5ns一個(gè)數(shù)據(jù),即200)
figure(1)
plot(abs(fft(SFM)));
title('發(fā)射信號的頻譜');
figure(2)
Fb=SFM.*SFM1;
plot(real(fft(Fb)));
title('混頻信號的頻譜');
d=(50000*Ts*c)/(2*Bw);
fprintf('距離為:%d米 ',d);
采樣頻率為時(shí)鐘頻率200MHz,從頻譜圖可以看出產(chǎn)生的信號頻率在25MHz至75MHz。

并且混頻后的中頻頻率差為
,與上述matlab產(chǎn)生的數(shù)據(jù)一樣,說明DDS產(chǎn)生的波形無誤。

-
FPGA
+關(guān)注
關(guān)注
1660文章
22406瀏覽量
636077 -
matlab
+關(guān)注
關(guān)注
189文章
3025瀏覽量
238681 -
雷達(dá)
+關(guān)注
關(guān)注
52文章
3325瀏覽量
123848 -
FMCW
+關(guān)注
關(guān)注
9文章
109瀏覽量
24345
原文標(biāo)題:利用matlab和FPGA產(chǎn)生FMCW波
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
專家支招:使用MATLAB和Simulink算法創(chuàng)建FPGA原型
一個(gè)FMCW調(diào)頻連續(xù)波雷達(dá)計(jì)算工具
請教:FMCW的連續(xù)波信號源,信號頻率能否真的連續(xù)?
學(xué)習(xí)MATLAB與FPGA聯(lián)合仿真,這幾本秘籍交給你
如何利用0832去產(chǎn)生鋸齒波輸出
Matlab/simulink在FPGA設(shè)計(jì)中的應(yīng)用
FMCW雷達(dá)系統(tǒng)的詳細(xì)介紹和計(jì)算公式及應(yīng)用的資料概述
毫米波傳感介紹:FMCW雷達(dá)系統(tǒng)設(shè)計(jì)的相關(guān)討論
用于主動(dòng)安全應(yīng)用的FMCW雷達(dá)設(shè)計(jì)
關(guān)于FMCW毫米波雷達(dá)遙感的應(yīng)用介紹
利用matlab和FPGA產(chǎn)生FMCW波
評論