基于FPGA數(shù)字混頻器的設(shè)計
掃描二維碼
隨時隨地手機(jī)看文章
基于FPGA數(shù)字混頻器的設(shè)計
1 混頻原理
混頻即兩個不同頻率之間的混合,得到第三個頻率。數(shù)字混頻器的設(shè)計也是FPGA數(shù)字信號處理中基礎(chǔ)入門的設(shè)計之一,混頻便是兩個信號相乘得它們的和頻率和差頻率。數(shù)字混頻在通信的調(diào)制、解調(diào)、DUC(數(shù)字上變頻)、DDC(數(shù)字下變頻)等系統(tǒng)中廣泛應(yīng)用。通常把其中一個信號稱為本振信號(local oscillator),另一個信號稱為混頻器的輸入信號。
2 設(shè)計目標(biāo)
在采樣頻率為44.1KHZ下通過DDS產(chǎn)生2KHZ的本振信號和3KHZ的外部輸入信號。對兩個信號分別進(jìn)行相加處理和相乘處理。使用matlab分析信號頻域和時域的變化。
3 matlab設(shè)計驗證
clear all close all clc FS = 44100;%采樣率 fc = 2000; %本振信號 2khz fe = 3000; %外部輸入信號 3khz N = 1024;%1024點一個正玄周期 Q = 32; %量化32bit t =0:2*pi/FS:2*pi*N/FS; sin_osc =sin(t*fc); sin_e =sin(t*fe); sin_mult = sin_osc.*sin_e; sin_add = sin_osc+sin_e; f_osc =fft(sin_osc,N); f_osc=20*log(abs(f_osc))/log(10); %換算成dBW單位 ft=[0:(FS/N):FS/2]; %轉(zhuǎn)換橫坐標(biāo)以Hz為單位 f_osc=f_osc(1:length(ft)); f_e =fft(sin_e,N); f_e=20*log(abs(f_e))/log(10); %換算成dBW單位 f_e=f_e(1:length(ft)); f_add =fft(sin_add,N); f_add=20*log(abs(f_add))/log(10); %換算成dBW單位 f_add=f_add(1:length(ft)); f_mult =fft(sin_mult,N); f_mult=20*log(abs(f_mult))/log(10); %換算成dBW單位 f_mult=f_mult(1:length(ft)); figure, hold on subplot(221),plot(t(1:128),sin_osc(1:128),'-'); legend('sinosc');title('2K HZ'); subplot(222),plot(t(1:128),sin_e(1:128),'-'); legend('sine');title('3K HZ'); subplot(223),plot(t(1:128),sin_add(1:128),'-'); legend('sinadd');title('add '); subplot(224),plot(t(1:128),sin_mult(1:128),'-'); legend('sinmult');title('mult '); grid; hold off figure, hold on subplot(221);plot(ft,f_osc); xlabel('頻率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8); title('信號頻譜圖 2KHZ','fontsize',8);legend('sinosc'); subplot(222);plot(ft,f_e); xlabel('頻率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8); title('信號頻譜圖3KHZ','fontsize',8);legend('sine'); subplot(223);plot(ft,f_mult); xlabel('頻率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8); title('信號頻譜圖1KHZ 和 6','fontsize',8);legend('sinmult'); subplot(224);plot(ft,f_add); xlabel('頻率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8); title('信號頻譜圖2KHZ 和 3KHZ','fontsize',8);legend('sinadd'); hold off
如上圖1所示,圖1左上1為2khz本振信號sin波,圖1右上2為3khz外部輸入sin波,圖1左下1為2khz+3khz時域波形,圖1右下1為2KHZ*3KHZ時域波形。
如上圖2所示,左下1為兩個信號相乘所得頻域圖形,分析可知2KHZ*3KHZ得到了1KHZ和6KHZ,右下1為兩個信號相加所得頻域圖像,分析可知2khz+3khz得到了2khz 和 3khz。
4 FPGA的程序設(shè)計
1) 相加模塊設(shè)計
`timescale 1ps/1ps module digital_add( input mclk,//45.1584MHZ input reset_n, input signed[31:0] pcm_in1, input signed[31:0] pcm_in2, output signed[31:0] pcm_out ); localparam LAST_CYCLE = 1023; reg [9:0] i; reg signed [32:0] pcm_r; assign pcm_out = pcm_r[32:1]; always @(posedge mclk or negedge reset_n) begin if(!reset_n) begin i<= 0; pcm_r <= 33'b0; end else begin i <= i + 1; if(i == 0) pcm_r <= pcm_in1 + pcm_in2;//add end end endmodule
相加會產(chǎn)生位擴(kuò)展。
2)相乘模塊設(shè)計
timescale 1ps/1ps module digital_mult( input mclk,//45.1584MHZ input reset_n, input signed[31:0] pcm_in1, input signed[31:0] pcm_in2, output signed[31:0] pcm_out ); localparam LAST_CYCLE = 1023; reg [9:0] i; reg signed [63:0] pcm_r; assign pcm_out = pcm_r[63:32]; always @(posedge mclk or negedge reset_n) begin if(!reset_n) begin i<= 0; pcm_r <= 0; end else begin i <= i + 1; if(i == 0) pcm_r <= pcm_in1*pcm_in2;//mult end end endmodule
觀察圖3 可知matlab仿真基本和FPGA時域波形一致,設(shè)計成功。接下來對FPGA設(shè)計處理的數(shù)據(jù)進(jìn)行分析。
由圖4和圖5與圖1和圖2對比,F(xiàn)PGA設(shè)計成功。