FPGA实现信号n倍插值(内插0)
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)相关推荐
- 信号内插matlab,声音信号的抽取和内插,MATLAB代码
声音信号抽取和内插的MATLAB程序 %%%l为抽取倍数,m为内插倍数,mp3为音频信号, %%%此程序实现音频信号的内插和抽取,并画出处理前后的信号时域.频域图像function myhomewor ...
- 离散信号的抽取与内插
信号的抽取和内插,在多速率采样章节是有详细介绍的,核心点就是变换信号的采样率. 参考百度文库的PPT:信号抽取与内插PPT 这个概念是对应于DFT性质尺度变换. 在介绍这个之前,先介绍一下信号处理中常 ...
- Altera FPGA 差分信号初识(2)
Altera FPGA 差分信号初识(2) 低压差分信号(LVDS) 低电压差分信号 ,或LVDS,也称为TIA / EIA-644,是一个技术标准,它指定的电特性的差分,串行 通信协议.LVDS以低 ...
- 离散信号的抽取和内插例题_《数字信号处理》学习指导与题解 2011年版
<数字信号处理>学习指导与题解 出版时间:2011年版 内容简介 <〈数字信号处理〉学习指导与题解>对"数字信号处理"教学大纲要求的所有知识点进行了提纲挈领 ...
- (3)FPGA面试题2倍分频
1.1 FPGA面试题2倍分频 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题2倍分频: 5)结束语. 1.1.2 本节引言 "不积跬步,无以至 ...
- 关于 FPGA 内部信号扇入扇出
转自https://www.cnblogs.com/dxs959229640/p/3870189.html 关于 FPGA 内部信号扇入扇出 扇入.扇出系数 扇入系数是指门电路允许的输入端数目.一般门 ...
- RGB与YUV转换以及存储格式(YIQ)(信号扫描线)(内插补点算法)(紧缩格式(packed formats))(平面格式(planar formats))
文章目录 色彩空间与色彩模型 色彩空间 色彩模型 不同色彩空间的比较 1.RGB(采集与显示) 2. YUV YCbCr的两种常用格式 1)ITU-R BT.601 conversion 2)JPEG ...
- 离散信号的抽取和内插例题_抽取和内插
多速率信号处理及抽取和内插 一:多速率信号处理 1 .在信号处理系统中有时需要不同的抽样率,这样做的目的有时是为了适应不 同系统之间的级联,以利于信号的处理.编码.传输和存储,有时则是为了节省 计算工 ...
- 数字信号处理之信号的抽取和内插
注:学这部分内容时参考了宗孔德教授的<多抽样率信号处理>教材 一.为什么需要整数倍抽取和内插:文章最后有更详细说明 理想情况下的信号采样大部分信号是单一频率,直接设置一个固定值fs就可以. ...
最新文章
- CCS编译添加链接库文件与头文件的方法
- 访问者模式讨论篇:java的动态绑定与双分派
- c#调用Discuz的UCenter 1.5的API及示例。
- Boost:post process后期处理的测试程序
- 11 父子组件数据关系与状态提升
- 攻防世界web高手进阶php_rce,php_rce 攻防世界xctf web
- 关于Linq to SQL 的“异常详细信息: System.InvalidCastException: 指定的转换无效。”
- IOS UIScrollView 滚动视图的使用和文档
- 巨头切入,或将改变云客服市场
- bzoj3998 [TJOI2015]弦论
- 大数据Hadoop学习记录(1)----HDFS目录和文件Shell操作
- @人生随笔:一年一影帝,百年周星驰
- 博客在微博中怎么添加html,新浪微博怎么进博客
- ps 简笔画效果制作
- 大型互联网公司如何防止黑客入侵?(下)
- Ardunio开发实例-PCF8563 RTC模块
- [Unity Mirror] 自定义角色生成
- Arduino电位器控制
- QT:表格操作QTableView详解
- Vue中如何引入ElementUI