国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

利用matlab和FPGA產生FMCW波

FPGA設計論壇 ? 來源:FPGA設計論壇 ? 2025-11-24 09:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、FMCW波

調頻連續波(frequency modulated continuous wave, FMCW),常用于雷達中進行距離檢測,其所用到的信號是一種頻率隨調制信號線性增長的調頻波,還可用于電纜的故障定位。本文基于電纜的故障定位這個方向,簡單介紹FMCW波的產生,也是對最近學習的一個記錄和總結。

由角調信號出發,其一般表達式為

aa515b10-c450-11f0-8c8f-92fbcf53809c.png

其中,A是振幅,aaacb7f8-c450-11f0-8c8f-92fbcf53809c.png?是信號的瞬時相位,ab069e3a-c450-11f0-8c8f-92fbcf53809c.png?是瞬時相位偏移(相對于?ab59d62c-c450-11f0-8c8f-92fbcf53809c.png?),abafd02c-c450-11f0-8c8f-92fbcf53809c.png?是信號的瞬時角頻率,ac07a5fe-c450-11f0-8c8f-92fbcf53809c.png?是信號的瞬時角頻偏(相對于?ab59d62c-c450-11f0-8c8f-92fbcf53809c.png?),除個2acb173a4-c450-11f0-8c8f-92fbcf53809c.png就從角頻率變為頻率。

對于調頻信號,就是瞬時頻率偏移隨調制信號m(t)成比例變化,即

ad07cf6a-c450-11f0-8c8f-92fbcf53809c.png

其中Kf為調頻靈敏度,單位是rad/s*V,此時瞬時相位偏移就是

ad5df836-c450-11f0-8c8f-92fbcf53809c.png

代入角調信號的一般表達式可得調頻信號的一般表達式為

adb59e42-c450-11f0-8c8f-92fbcf53809c.png

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

ae0e2012-c450-11f0-8c8f-92fbcf53809c.png

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

ae637d00-c450-11f0-8c8f-92fbcf53809c.png

于是便可得到線性調頻連續波的表達式為

aebcd102-c450-11f0-8c8f-92fbcf53809c.png

af1343d4-c450-11f0-8c8f-92fbcf53809c.png看作是?af672f9e-c450-11f0-8c8f-92fbcf53809c.png?的話,可以看出其頻率從fc開始以K/2的斜率線性增加。

對于FMCW雷達測距更加詳細的原理請看:

調頻連續波(FMCW)雷達測距、測速詳解-CSDN博客

如果假設發射信號Si為

afbd8402-c450-11f0-8c8f-92fbcf53809c.png

則其頻率為

b01317fa-c450-11f0-8c8f-92fbcf53809c.png

發射信號進入電纜中碰到故障位置會發生反射,則接收信號Sr為

b069b7e0-c450-11f0-8c8f-92fbcf53809c.png

其中b0bf2e5a-c450-11f0-8c8f-92fbcf53809c.png為時延,則其頻率為

b112f206-c450-11f0-8c8f-92fbcf53809c.png

若將接收信號和發射信號進行混頻,濾波,可以得到一個它們之間的一個頻率差,為

b169ce64-c450-11f0-8c8f-92fbcf53809c.png

也就是說發射信號和接收信號混合后會產生一個頻率為b1c06832-c450-11f0-8c8f-92fbcf53809c.png的信號。也可以將Si與Sr的三角表達式進行相乘(混頻),也能得到一個頻率為b1c06832-c450-11f0-8c8f-92fbcf53809c.png的信號。

又由于對于線性調頻信號,

b26f1bd4-c450-11f0-8c8f-92fbcf53809c.png

其中fb是頻率差,b0bf2e5a-c450-11f0-8c8f-92fbcf53809c.png為時延,B為帶寬,T為調制周期,并且

b3184010-c450-11f0-8c8f-92fbcf53809c.png

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

b36bdce8-c450-11f0-8c8f-92fbcf53809c.png

也就是說,只要得到頻率差fb和傳播速度v就能得到故障點的距離D。

二、matlab產生FMCW波

設置的參數有調制周期Ts為1ms,帶寬Bw為50MHz,起始頻率fc為25MHz,采樣頻率fs為200MHz,則斜率tao為Bw/Ts。

clear;clc;

Ts = 0.001; %調制周期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; %一個周期的采樣點數

t = 0Ts-dt; %時間序列

Am=1; % 信號幅度

SFM=Am*cos(2*pi*(fc+(tao/2)*t).*t); %發射信號

figure(1); % 繪制第一幅圖

subplot(211); % 窗口分割,將一幅圖分割成2*2的

plot(t,SFM,'Linewidth',2); % 時間t為橫坐標,基帶信號SFM為縱坐標繪圖,線寬為2

xlabel('t/時間'); % 橫坐標標注

ylabel('幅度'); % 縱坐標標注

title('發射信號'); % 圖標題標注

axis([10e-4*Ts*100,10e-4*Ts*101,-1.1,1.1]); % 橫縱坐標范圍設置

line([10e-4*Ts*100,10e-4*Ts*101],[0,0],'color','b','Linewidth',2);% 繪制一條從(0,0)到(0.1,0)的藍色實線,線寬為2

subplot(212);

[mf,msf]=T2F(t,SFM); % 傅里葉變換,得到縱坐標頻譜和橫坐標頻率

subplot(212);

plot(mf,abs(msf),'Linewidth',1); % 畫出SFM信號頻譜 頻譜以fm為間隔

title('發射信號的頻譜'); % 圖標題標注

xlabel('f/Hz'); % 橫坐標標注

ylabel('幅度/H(f)'); % 縱坐標標注

t1=1e-6; %時延 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)); %巴特沃斯濾波器參數

Xb=filter(b,a,Fb); %濾波 tao*t1的中頻頻率

figure(2); % 繪制第二幅圖

subplot(211); % 窗口分割,將一幅圖分割成2*1的

plot(t,Xb,'Linewidth',2);

title('接收混頻信號'); % 圖標題標注

xlabel('t/時間'); % 橫坐標標注

ylabel('幅度'); % 縱坐標標注

axis([0,Ts*0.5,-1.1,1.1]); % 橫縱坐標范圍設置

[mf2,msf2]=T2F(t,Xb); % 傅里葉變換,得到縱坐標頻譜和橫坐標頻率

subplot(212);

plot(mf2,real(msf2),'Linewidth',1); % 畫出AM信號頻譜 頻譜以fm為間隔

title('混頻信號的頻譜'); % 圖標題標注

xlabel('f/Hz'); % 橫坐標標注

ylabel('幅度/H(f)'); % 縱坐標標注

d=(3e8*Ts*tao*t1)/(2*Bw); %距離計算

fprintf('距離為:%d米 ',d);

function [f,sf]= T2F(t,st) % FFT

% dt = t(2)-t(1);

T=t(end); % 輸入信號的時間最大值為T

df = 1/T; % dt=1/fs; 時間采樣間隔,采樣頻率的倒數;

% N=T/dt; 采樣點個數,總時長除以采樣間隔

% 兩式聯合推導 df = 1/T

N = length(st); % 輸入信號時間的長度為采樣點數

f=-N/2*df : df : N/2 * df-df; % 頻率分布

sf = fft(st); % 做FFT

sf = T/N * fftshift(sf); % 最后輸出,將0-fs頻譜搬移到-fs/2-fs/2頻譜

發射信號的波形圖如下,只看了一小部分,實際上觀看同樣長度,不同時間頻率是變化的。

b3c1d88c-c450-11f0-8c8f-92fbcf53809c.png

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

b4185d42-c450-11f0-8c8f-92fbcf53809c.png

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

b4705e34-c450-11f0-8c8f-92fbcf53809c.png

假設信號在電纜中以光速傳播,即v=300000000m/s,則可以計算得到距離D為150m。并且假設雷達信號在空氣中以光速傳播,則1us后接收到信號,實際是雷達信號傳播了300m,即在150m處反射。可以說明上述的公式推導正確。

三、FPGA產生FMCW波

要在FPGA中去產生FMCW波需要用到DDS IP核。利用其頻率控制字去控制DDS產生頻率線性增長的波。本文利用vivado軟件,Verilog語言進行仿真產生波形數據,再將數據導入matlab中進行校驗。選取的板塊時鐘頻率為200MHz,即5ns一個數據。

下面是DDS IP核的簡單配置,更加詳細的配置可以參考其他文章。第一個界面中將參數選擇設置為硬件參數,在相位位寬處可以設置需要的位寬,這里是32位。位寬數用于計數頻率控制字。

b4c6f442-c450-11f0-8c8f-92fbcf53809c.png

第二個頁面將相位的增加形式設置為Streaming,可以在代碼中去控制輸入的相位數據改變頻率,適合產生調頻信號。

b5200140-c450-11f0-8c8f-92fbcf53809c.png

后續都保持默認就行。

b5764028-c450-11f0-8c8f-92fbcf53809c.png

對于DDS的輸出頻率有計算公式

b5ccfd0a-c450-11f0-8c8f-92fbcf53809c.png

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

b6213a78-c450-11f0-8c8f-92fbcf53809c.png

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

b6766796-c450-11f0-8c8f-92fbcf53809c.png

也就是每個時鐘周期頻率控制字增加5369。

//產生連續的線性調頻信號,200MHz時鐘,1ms調制周期,25MHz起始頻率,帶寬50MHz,步長(一個時鐘周期5ns增加)250Hz

//32位,fout=fclk*K/2^32,K位相位控制字,則起始頻率K=536870912,步長K=5369

module Gen_LFM

#(

parameter CNT_TAO_MAX = 32'd199999 //1ms計數值

)

(

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計數器

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; //步進頻率為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; ?// 延遲一個時鐘周期

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 ;

//將數據導出為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);//將數據保存為二進制

end

else if (tao_en == 1'b0 && tao_en_d1 == 1'b1) begin

$fclose(real_out_file);

end

end

endmodule

在vivado的仿真圖中可以看到輸出的頻率是逐漸增加的,并且在1ms后頻率又回到25MHz。

b6cbba02-c450-11f0-8c8f-92fbcf53809c.png

b7227892-c450-11f0-8c8f-92fbcf53809c.png

將導出的數據用matlab讀取

clear;clc;

Bw = 50e6;

Ts = 0.001;

c=3e8;

fileID = fopen('cos_real.txt', 'r');

% 讀取整個文件內容為字符串

file_content = fscanf(fileID, '%c');

% 關閉文件

fclose(fileID);

% 移除所有非二進制字符(如換行符、空格等)

file_content = regexprep(file_content, '[^01]', '');

% 設置二進制位數(例如8位表示一個字節)

bits_per_number = 16;

% 計算可轉換的完整二進制數數量

num_numbers = floor(length(file_content) / bits_per_number);

% 初始化結果數組

decimal_values = zeros(num_numbers, 1);

% 逐塊轉換

for i = 1:num_numbers

% 提取固定位數的二進制字符串

binary_str = file_content((i-1)*bits_per_number+1 : i*bits_per_number);

% 轉換為十進制

decimal_values(i) = bin2dec(binary_str);

end

SFM=(decimal_values-4096)./2048;

SFM1 = [SFM(end-199:end); SFM(1:end-200)]; % 延遲1us(5ns一個數據,即200)

figure(1)

plot(abs(fft(SFM)));

title('發射信號的頻譜');

figure(2)

Fb=SFM.*SFM1;

plot(real(fft(Fb)));

title('混頻信號的頻譜');

d=(50000*Ts*c)/(2*Bw);

fprintf('距離為:%d米 ',d);


采樣頻率為時鐘頻率200MHz,從頻譜圖可以看出產生的信號頻率在25MHz至75MHz。

b77bb312-c450-11f0-8c8f-92fbcf53809c.png

并且混頻后的中頻頻率差為b7d2f3d4-c450-11f0-8c8f-92fbcf53809c.png,與上述matlab產生的數據一樣,說明DDS產生的波形無誤。

b829cf74-c450-11f0-8c8f-92fbcf53809c.png

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1656

    文章

    22317

    瀏覽量

    631097
  • matlab
    +關注

    關注

    189

    文章

    3020

    瀏覽量

    237776
  • 雷達
    +關注

    關注

    51

    文章

    3275

    瀏覽量

    122994
  • FMCW
    +關注

    關注

    9

    文章

    105

    瀏覽量

    24268

原文標題:利用matlab和FPGA產生FMCW波

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    專家支招:使用MATLAB和Simulink算法創建FPGA原型

    本文將介紹使用MATLAB和Simulink創建FPGA原型的最佳方法。這些最佳方法包括:在設計過程初期分析定點量化的效應并優化字長,產生更小、更高效的實現方案;利用自動HDL代碼生成
    發表于 01-28 11:08 ?1.7w次閱讀
    專家支招:使用<b class='flag-5'>MATLAB</b>和Simulink算法創建<b class='flag-5'>FPGA</b>原型

    一個FMCW調頻連續雷達計算工具

    跟大家分享一個FMCW調頻連續的計算工具。
    發表于 07-16 15:11

    請教:FMCW的連續信號源,信號頻率能否真的連續?

    最近要做調頻連續測距(距離范圍10米以內),看了很多前輩的資料,對于掃頻源有些不了解,請各位賜教,謝謝!FMCW測距要求發射信號頻率連續,利用回波信號和發射信號的頻率差來計算距離。目前學習到的方案
    發表于 03-28 22:59

    fpga如何控制AD9910產生正弦

    fpga產生控制指令控制AD9910產生正弦
    發表于 07-01 20:13

    學習MATLABFPGA聯合仿真,這幾本秘籍交給你

    MATLABFPGA設計中的應用:本文提出將 FPGA設計環境中的測試數據通過文本文件格式傳遞給 MATLAB軟件, 再利用
    發表于 05-12 15:48

    如何利用0832去產生鋸齒輸出

    如何利用0809去完成1個通道的模擬量采集?如何利用8255輸出二進制碼?如何利用0832去產生鋸齒輸出?
    發表于 08-03 07:40

    如何利用DMA產生正弦

    DAC的主要特點是什么?DAC由什么組成?如何利用DMA產生正弦
    發表于 02-28 06:33

    Matlab/simulink在FPGA設計中的應用

    文中首先分析了MATLAB/Simulink 中DSP Builder 模塊庫在FPGA 設計中優點,然后結合FSK 信號的產生原理,給出了如何利用DSP Builder 模塊庫建立F
    發表于 08-27 12:07 ?87次下載

    FMCW雷達系統的詳細介紹和計算公式及應用的資料概述

    FMCW,即調頻連續FMCW技術和脈沖雷達技術是兩種在高精度雷達測距中使用的技術。其基本原理為發射為高頻連續,其頻率隨時間按照三角
    的頭像 發表于 07-03 14:05 ?2.7w次閱讀
    <b class='flag-5'>FMCW</b>雷達系統的詳細介紹和計算公式及應用的資料概述

    毫米傳感介紹:如何估計FMCW雷達的角度?

    1.5 毫米傳感介紹:FMCW雷達 - 模塊5:角度估計
    的頭像 發表于 08-17 00:28 ?7529次閱讀

    毫米傳感介紹:FMCW雷達的范圍估計介紹

    1.1 毫米傳感介紹:FMCW雷達 - 模塊1:范圍估計
    的頭像 發表于 08-17 01:20 ?6995次閱讀

    毫米傳感介紹:FMCW雷達如何估計物體速度

    1.3 毫米傳感介紹:FMCW雷達 - 模塊3:速度估計
    的頭像 發表于 08-02 01:19 ?6287次閱讀

    毫米傳感介紹:FMCW雷達系統設計的相關討論

    1.4 毫米傳感介紹:FMCW雷達 - 模塊4:一些系統設計討論
    的頭像 發表于 05-10 06:09 ?4401次閱讀
    毫米<b class='flag-5'>波</b>傳感介紹:<b class='flag-5'>FMCW</b>雷達系統設計的相關討論

    用于主動安全應用的FMCW雷達設計

      本文介紹了使用基于 MATLAB 的工具鏈對用于汽車主動安全應用的完整 FMCW 雷達系統進行建模和仿真。
    的頭像 發表于 06-16 16:16 ?2317次閱讀
    用于主動安全應用的<b class='flag-5'>FMCW</b>雷達設計

    關于FMCW毫米雷達遙感的應用介紹

    FMCW雷達發射一種叫做“啁啾”的信號。其頻率隨時間線性增加的正弦,如這里的振幅和時間(或‘-t’圖)。
    發表于 10-27 09:58 ?963次閱讀
    關于<b class='flag-5'>FMCW</b>毫米<b class='flag-5'>波</b>雷達遙感的應用介紹