前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于FPGA数字混频器的设计

基于FPGA数字混频器的设计

作者头像
FPGA开源工作室
发布2019-10-29 18:04:46
1.5K0
发布2019-10-29 18:04:46
举报

基于FPGA数字混频器的设计

1 混频原理

混频即两个不同频率之间的混合,得到第三个频率。数字混频器的设计也是FPGA数字信号处理中基础入门的设计之一,混频便是两个信号相乘得它们的和频率和差频率。数字混频在通信的调制、解调、DUC(数字上变频)、DDC(数字下变频)等系统中广泛应用。通常把其中一个信号称为本振信号(local oscillator),另一个信号称为混频器的输入信号。

2 设计目标

在采样频率为44.1KHZ下通过DDS产生2KHZ的本振信号和3KHZ的外部输入信号。对两个信号分别进行相加处理和相乘处理。使用matlab分析信号频域和时域的变化。

3 matlab设计验证

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];              %转换横坐标以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 matlab时域波形

如上图1所示,图1左上1为2khz本振信号sin波,图1右上2为3khz外部输入sin波,图1左下1为2khz+3khz时域波形,图1右下1为2KHZ*3KHZ时域波形。

图2 信号频域分析

如上图2所示,左下1为两个信号相乘所得频域图形,分析可知2KHZ*3KHZ得到了1KHZ和6KHZ,右下1为两个信号相加所得频域图像,分析可知2khz+3khz得到了2khz 和 3khz。

4 FPGA的程序设计

1) 相加模块设计

`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

相加会产生位扩展。 2)相乘模块设计

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 数字混频器的modelsim时域波形

观察图3 可知matlab仿真基本和FPGA时域波形一致,设计成功。接下来对FPGA设计处理的数据进行分析。

图4 FPGA产生的2khz 和3khz时域和频域波形

图5 混频后时域和频域分析

由图4和图5与图1和图2对比,FPGA设计成功。

DSP往期

音频总线I2S协议

信号的产生

信号的基本概念

滤波器的分类

基于LUT的DDS的设计

基于FPGA低通滤波器的FIR的设计

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA开源工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于FPGA数字混频器的设计
    • 1 混频原理
      • 2 设计目标
        • 3 matlab设计验证
          • 4 FPGA的程序设计
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档