基于FPGA數(shù)字混頻器的設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
基于FPGA數(shù)字混頻器的設(shè)計(jì)
1 混頻原理
混頻即兩個不同頻率之間的混合,得到第三個頻率。數(shù)字混頻器的設(shè)計(jì)也是FPGA數(shù)字信號處理中基礎(chǔ)入門的設(shè)計(jì)之一,混頻便是兩個信號相乘得它們的和頻率和差頻率。數(shù)字混頻在通信的調(diào)制、解調(diào)、DUC(數(shù)字上變頻)、DDC(數(shù)字下變頻)等系統(tǒng)中廣泛應(yīng)用。通常把其中一個信號稱為本振信號(local oscillator),另一個信號稱為混頻器的輸入信號。
2 設(shè)計(jì)目標(biāo)
在采樣頻率為44.1KHZ下通過DDS產(chǎn)生2KHZ的本振信號和3KHZ的外部輸入信號。對兩個信號分別進(jìn)行相加處理和相乘處理。使用matlab分析信號頻域和時(shí)域的變化。
3 matlab設(shè)計(jì)驗(yàn)證
clear all
close all
clc
FS = 44100;%采樣率
fc = 2000; %本振信號 2khz
fe = 3000; %外部輸入信號 3khz
N = 1024;%1024點(diǎn)一個正玄周期
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時(shí)域波形,圖1右下1為2KHZ*3KHZ時(shí)域波形。
如上圖2所示,左下1為兩個信號相乘所得頻域圖形,分析可知2KHZ*3KHZ得到了1KHZ和6KHZ,右下1為兩個信號相加所得頻域圖像,分析可知2khz+3khz得到了2khz 和 3khz。
4 FPGA的程序設(shè)計(jì)
1) 相加模塊設(shè)計(jì)
`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è)計(jì)
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í)域波形一致,設(shè)計(jì)成功。接下來對FPGA設(shè)計(jì)處理的數(shù)據(jù)進(jìn)行分析。
由圖4和圖5與圖1和圖2對比,F(xiàn)PGA設(shè)計(jì)成功。





