FPGA实现信号n倍插值(内插0)

  • 0 简介
  • 1 MATLAB仿真
    • 1.1 源代码
    • 1.2 仿真结果
  • 2 FPGA实现
    • 2.1 系统结构
    • 2.2 源代码
    • 2.3 仿真结果
  • 3 完整工程链接

0 简介

目的:在保证信号不失真的前提下,增加AD采样后的序列的采样点。
场景:100M的AD采样率采集到系统,但是现在要求在不使用fifo的情况下,以300M的速率通过DA将采集数据传出去。
实现方法:在信号采样点之间插0,然后带通滤波。

1 MATLAB仿真

1.1 源代码

% // 程序功能说明:
% // 1、用100M的系统钟产生10M的点频信号RtI(一个周期采10个点)
% // 2、对RtI进行三倍内插,一个点插两个0
% // 3、低通滤波器滤波,保留10M的信号close all;
clear all;
clc;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%           参数定义
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Quantify_bit=16;   % 希尔伯特滤波器量化位数 16位
fs=100e6;          % 采样频率  以内插后的信号频率为准
COUNT=1000;
t=0:1/fs:(COUNT-1)/fs;
fc=10e6;
st=cos(2*pi*fc*t);  % 原始信号
fs_300M=3*fs;       % 三倍内插figure(1)
plot(st);
title('原始信号');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%               3倍 内插
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for p=1:3*COUNTif(mod(p,3)==1)st_inter(p)=st((p+2)/3);elsest_inter(p)=0;end
endfigure(2)
subplot(211);
plot(st_inter);L_inter=length(st_inter);
f=(0:L_inter-1)*fs_300M/L_inter-fs_300M/2;
subplot(212);
plot(f/1e6,abs(fftshift(fft(st_inter)))/L_inter);
xlabel('频率/MHz');ylabel('幅度')
title('内插后的信号');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%            低通滤波器
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%LOW_PASS Returns a discrete-time filter object.% MATLAB Code
% Generated by MATLAB(R) 9.5 and Signal Processing Toolbox 8.1.
% Generated on: 26-Mar-2022 21:53:46% FIR Window Lowpass filter designed using the FIR1 function.% All frequency values are in MHz.
Fs = 300;  % Sampling FrequencyFpass = 11;              % Passband Frequency
Fstop = 20;              % Stopband Frequency
Dpass = 0.057501127785;  % Passband Ripple
Dstop = 0.001;           % Stopband Attenuation
flag  = 'scale';         % Sampling Flag% Calculate the order from the parameters using KAISERORD.
[N,Wn,BETA,TYPE] = kaiserord([Fpass Fstop]/(Fs/2), [1 0], [Dstop Dpass]);% Calculate the coefficients using the FIR1 function.
b  = fir1(N, Wn, TYPE, kaiser(N+1, BETA), flag);L=length(b);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%      导出滤波器系数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fid=fopen('low_pass.coe','w');  % 实部
[h_data]= coe_generate(fid,Quantify_bit,L,b);% y1=conv(b,st);
% y1_end=y1(round(L/2):1:end-round(L/2));
% figure(2);
% subplot(211);plot(t,st);
% subplot(212);plot(t,y1_end);
% legend('原始信号','原始信号过带通滤波后的信号');y2=conv(b,st_inter);
y2_end=y2(round(L/2):1:end-round(L/2));
figure(3);
subplot(211);plot(y2_end);L_y2_end=length(y2_end);
f=(0:L_y2_end-1)*fs_300M/L_y2_end-fs_300M/2;
subplot(212);
plot(f/1e6,abs(fftshift(fft(y2_end)))/L_y2_end);
xlabel('频率/MHz');ylabel('幅度')
title('内插后的信号过带通滤波器');

1.2 仿真结果


可以看出,插值后的信号以fs=100M的频率对信号频谱进行周期延拓,所以在频谱中新增了90M和110M的频率分量。为了保证信号不失真,我们需要设计带通滤波器将这两个频率分量滤掉 。
为什么会出现90MHE和110M的频率分量?
答:经过内插和低通滤波后,此时的信号是模拟信号。然后经过采样频率Fs=300MHz的AD,就会根据(时域的离散化对应频域的周期化)观察该频率分量。具体见AD,DA。
需要注意的是,一般是设计带通滤波器来滤掉其他频率分量,但在这里也可以用低通滤波器。这是根据插值后的信号的频谱得出该结论的。


需要注意的是,内插后的信号进过低通滤波器后,信号幅度变成变成了原来信号幅度的1/3,如上图所示。理由:根据能量守恒定理,采样点数变成了原来的3倍,但内插值全为0,所以为了保证能量守恒,信号幅度会变为原来的1/3。

2 FPGA实现

2.1 系统结构


FIR IP 设置:


DDS IP设置:

2.2 源代码

top文件

`timescale 1ns / 1ps
// 程序功能说明:
// 1、用100M的系统钟产生10M的点频信号RtI(一个周期采10个点)
// 2、对RtI进行三倍内插,一个点插两个0
// 3、带通滤波器滤波,保留10M的信号module top(input           sys_clk         ,//系统时钟  100Minput           rst_n           , //系统复位input           En_Inter          //插值使能信号
);parameter  Inter_yinzi = 3   ;// 三倍内插   clk_300M/sys_clk=3,所以是三倍内插//output
wire [0:0]   Signal_tvalid    ;
wire [47:0]  Signal_tdata     ;
wire [0:0]   Phase_tvalid   ;
wire [23:0]  Phase_tdata    ;//-----DDS   1、产生10M的点频信号// 虚系统钟 100M,也就是采样频率100M,一个周期采集了10个点//  The output frequency(f_out ) , of the DDS waveform is a function of the system clock frequency(f_clk ) .//  the phase width, that is, number of bits (B )  in the phase accumulator //  and the phase increment value (deta_theta) . //  The output frequency in Hertz is defined by:f_out=f_clk*deta_theta/(2^B)//  fre_ctrl_word是如何确定的?// 根据IP核的summery, phase width=20bits   Frequency per channel=100MHz// 输出频率的计算公式f_out=f_clk*deta_theta/(2^B)=100M* 104857/(2^20 )= 10M
dds_sin dds_sin_inst (.aclk                 (sys_clk                ),    // input wire aclk.s_axis_config_tvalid (1'b1        ),    // input wire s_axis_config_tvalid.s_axis_config_tdata  ('h19999     ),    // input wire [23: 0] s_axis_config_tdata.m_axis_data_tvalid   (Signal_tvalid     ),    // output wire m_axis_data_tvalid.m_axis_data_tdata    (Signal_tdata      ),    // output wire [47 : 0] m_axis_data_tdata.m_axis_phase_tvalid  (Phase_tvalid    ),    // output wire m_axis_phase_tvalid.m_axis_phase_tdata   (Phase_tdata     )     // output wire [23 : 0] m_axis_phase_tdata
); wire [15:0]    RtI ;//参考信号的实部  与频率字相对应
wire [15:0]    RtQ ;
assign RtI=Signal_tdata[19:4];  //I:实部   Q:虚部
assign RtQ=Signal_tdata[43:28]; // --------------2、产生300M的内部时钟
wire clk_300M;
wire locked;clk_wiz_0 Inst_clk_wiz_0(// Clock out ports.clk_out1(clk_300M),     // output clk_out1// Status and control signals.reset(~rst_n), // input reset.locked(locked),       // output locked// Clock in ports.clk_in1(sys_clk)
);      // input clk_in1// -----------3、模块功能:信号3倍内插
wire [15:0] Data_inter;//  [15:0]  三倍插0后的信号
wire Data_inter_vaild;// 有效信号
Interpolate Inst_Interpolate(//input.clk_300M         (clk_300M         )   ,//工作时钟.rst_n            (rst_n            )   ,.RtI              (RtI              )   ,//  [15:0] .En_Inter         (En_Inter         )   ,//使能信号.Inter_yinzi      (Inter_yinzi      )   ,//内插倍数  [15:0]  clk_300M/sys_clk=3,所以是三倍内插//output.Data_inter       (Data_inter       )   ,//  [15:0]  三倍插0后的信号.Data_inter_vaild (Data_inter_vaild )
);//  4 、低通滤波器  10M信号的频率通过 采样率 300Mwire [31:0]  FIR_data_tdata;wire FIR_data_tvalid;fir_compiler_Freq1 Inst_fir_compiler (.aclk(clk_300M),                              // input wire aclk.s_axis_data_tvalid(Data_inter_vaild),  // input wire s_axis_data_tvalid.s_axis_data_tready(),  // output wire s_axis_data_tready.s_axis_data_tdata(Data_inter),    // input wire [15 : 0] s_axis_data_tdata.m_axis_data_tvalid(FIR_data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(FIR_data_tdata)    // output wire [31 : 0] m_axis_data_tdata);wire  [15:0]  Data_inter_filter;assign Data_inter_filter=FIR_data_tdata[31:16];  endmodule

子模块

`timescale 1ns / 1ps// 模块功能:信号内插
module Interpolate(input               clk_300M            ,//工作时钟input               rst_n               ,input  [15:0]       RtI                 ,input               En_Inter            ,//使能信号input  [15:0]       Inter_yinzi         ,//内插倍数  clk_300M/sys_clk=3,所以是三倍内插output reg [15:0]   Data_inter          ,output reg          Data_inter_vaild
);//----------- 三倍内插reg [15:0] count; always@(posedge clk_300M)beginif(!rst_n)beginData_inter<=16'dx;count<=16'd0;Data_inter_vaild<=1'b0;endelse // 系统没有复位if(En_Inter )//插值使能有效,且时钟clk_300M有效begincount<=count+1;Data_inter_vaild<=1'b1;  if(count<Inter_yinzi-1) // Inter_yinzi 倍内插 0 1 2beginData_inter<=16'd0;                        endelse// count=2beginData_inter<=RtI;count<=16'd0;     endendelsebeginData_inter<=RtI;Data_inter_vaild<=1'b1; count<=16'd0; end      end    endmodule

2.3 仿真结果



3 完整工程链接

https://download.csdn.net/download/weixin_46136963/85041190

下载链接

FPGA实现信号n倍插值(内插0)相关推荐

  1. 信号内插matlab,声音信号的抽取和内插,MATLAB代码

    声音信号抽取和内插的MATLAB程序 %%%l为抽取倍数,m为内插倍数,mp3为音频信号, %%%此程序实现音频信号的内插和抽取,并画出处理前后的信号时域.频域图像function myhomewor ...

  2. 离散信号的抽取与内插

    信号的抽取和内插,在多速率采样章节是有详细介绍的,核心点就是变换信号的采样率. 参考百度文库的PPT:信号抽取与内插PPT 这个概念是对应于DFT性质尺度变换. 在介绍这个之前,先介绍一下信号处理中常 ...

  3. Altera FPGA 差分信号初识(2)

    Altera FPGA 差分信号初识(2) 低压差分信号(LVDS) 低电压差分信号 ,或LVDS,也称为TIA / EIA-644,是一个技术标准,它指定的电特性的差分,串行 通信协议.LVDS以低 ...

  4. 离散信号的抽取和内插例题_《数字信号处理》学习指导与题解 2011年版

    <数字信号处理>学习指导与题解 出版时间:2011年版 内容简介 <〈数字信号处理〉学习指导与题解>对"数字信号处理"教学大纲要求的所有知识点进行了提纲挈领 ...

  5. (3)FPGA面试题2倍分频

    1.1 FPGA面试题2倍分频 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题2倍分频: 5)结束语. 1.1.2 本节引言 "不积跬步,无以至 ...

  6. 关于 FPGA 内部信号扇入扇出

    转自https://www.cnblogs.com/dxs959229640/p/3870189.html 关于 FPGA 内部信号扇入扇出 扇入.扇出系数 扇入系数是指门电路允许的输入端数目.一般门 ...

  7. RGB与YUV转换以及存储格式(YIQ)(信号扫描线)(内插补点算法)(紧缩格式(packed formats))(平面格式(planar formats))

    文章目录 色彩空间与色彩模型 色彩空间 色彩模型 不同色彩空间的比较 1.RGB(采集与显示) 2. YUV YCbCr的两种常用格式 1)ITU-R BT.601 conversion 2)JPEG ...

  8. 离散信号的抽取和内插例题_抽取和内插

    多速率信号处理及抽取和内插 一:多速率信号处理 1 .在信号处理系统中有时需要不同的抽样率,这样做的目的有时是为了适应不 同系统之间的级联,以利于信号的处理.编码.传输和存储,有时则是为了节省 计算工 ...

  9. 数字信号处理之信号的抽取和内插

    注:学这部分内容时参考了宗孔德教授的<多抽样率信号处理>教材 一.为什么需要整数倍抽取和内插:文章最后有更详细说明 理想情况下的信号采样大部分信号是单一频率,直接设置一个固定值fs就可以. ...

最新文章

  1. CCS编译添加链接库文件与头文件的方法
  2. 访问者模式讨论篇:java的动态绑定与双分派
  3. c#调用Discuz的UCenter 1.5的API及示例。
  4. Boost:post process后期处理的测试程序
  5. 11 父子组件数据关系与状态提升
  6. 攻防世界web高手进阶php_rce,php_rce 攻防世界xctf web
  7. 关于Linq to SQL 的“异常详细信息: System.InvalidCastException: 指定的转换无效。”
  8. IOS UIScrollView 滚动视图的使用和文档
  9. 巨头切入,或将改变云客服市场
  10. bzoj3998 [TJOI2015]弦论
  11. 大数据Hadoop学习记录(1)----HDFS目录和文件Shell操作
  12. @人生随笔:一年一影帝,百年周星驰
  13. 博客在微博中怎么添加html,新浪微博怎么进博客
  14. ps 简笔画效果制作
  15. 大型互联网公司如何防止黑客入侵?(下)
  16. Ardunio开发实例-PCF8563 RTC模块
  17. [Unity Mirror] 自定义角色生成
  18. Arduino电位器控制
  19. QT:表格操作QTableView详解
  20. Vue中如何引入ElementUI

热门文章

  1. 2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解
  2. ----已搬运----【总章程】SSRF完全学习,,什么都有,,,原理,绕过,攻击
  3. java学习视频分享
  4. python opencv入门 鼠标绘图(4)
  5. Qt Quick 4小时入门-安晓辉-专题视频课程
  6. 文件包含漏洞(完整版)
  7. Unity学习笔记:Animator、Animator Controller、Animation Cilp之间的关系、以及Blend Tree的用法;
  8. SqlServer 数据库修复
  9. 分布式系统概念和设计-操作系统中的支持和设计
  10. 老领导调岗,你想跟他干,怎么说?