专栏首页FPGA开源工作室基于FPGA单级CIC滤波器实现8倍抽取

基于FPGA单级CIC滤波器实现8倍抽取

基于FPGA单级CIC滤波器实现8倍抽取

1 概述

在数字信号处理中,CIC滤波器是FIR滤波器中最优的一种,其使用了积分,梳状滤波器级联的方式。

CIC滤波器由一对或多对积分-梳状滤波器组成,在抽取CIC中,输入信号依次经过积分,降采样,以及与积分环节数目相同的梳状滤波器。在内插CIC中,输入信号依次经过梳状滤波器,升采样,以及与梳状数目相同的积分环节。

CIC滤波器的发明者是 Eugene B. Hogenauer,这是一类使用在不同频率的数字信号处理中的滤波器,在内插和抽取中使用广泛。与大多数FIR滤波器不同的是,它有一个内插或者抽取的结构。

1,线性相位响应

2,仅需延迟,加减法便可实现,不需要乘法,在FPGA等平台上易于实现。

2 单级CIC滤波器

CIC滤波器的冲击响应为:

3 设计目标

利用单级CIC滤波器将采样率为352.8KHZ的1khz sin波向下降采样率到44.1khz的1khz sin波(8倍抽取)。

1,matlab设计验证

2,FPGA verilog设计验证。

4 matlab设计验证

%Single CIC

%352.8khz sample rate down to 44.1khz sample rate

close all

clc

clear all

%参数定义

FS =352800; %Sample rate Frequncy

fc = 1000; %1khz

N = 1024;

Q = 16;

M= 8;

D = 8;

t =0:2*pi/FS:2*pi*(N-1)/FS;%时间序列

%波形产生

sin_osc =sin(t*fc);

%滤波器系数

b=ones(1,M);

a = 1;

%8倍抽值处理

sf=filter(b,a,sin_osc);

sm =sf./M;

sd=sm(1:D:length(t));

%绘图

figure(1),

subplot(221),stem(sin_osc);

title('采样频率352.8khz 1khz sin','fontsize',8);

subplot(222),stem(si0);

title('采样频率44.1khz 1khz sin','fontsize',8);

subplot(223);plot(f,mag);

xlabel('频率(Hz)','fontsize',8);

ylabel('幅度(dB)','fontsize',8);

title('freqz()幅频响应','fontsize',8);

subplot(224);plot(f,ph);

xlabel('频率(Hz)','fontsize',8);

ylabel('相位(度)','fontsize',8);

图1 8倍抽取前后的1khz sin时域波形

图2 滤波器系数的幅频和相频响应

由图1和图2分析可知,单级CIC滤波器的降采样率设计成功。

5 FPGA设计验证

FPGA的单级cic滤波器的设计其实就是一个滑动平均滤波器,由一个累加器和一个移位操作完成。

`timescale 1ps/1ps
module cic(
       input mclk,//45.1584MHZ
	   input reset_n,
	   input signed[31:0] pcm_in,//352.8khz 
	   output signed[31:0] pcm_out //44.1khz
	   );
	   
localparam LAST_CYCLE = 128;
reg [9:0] i;//44.1

reg signed [35:0] temp_pcm;
reg signed [35:0] dout_pcm;
assign pcm_out = dout_pcm[35:4];
always @(posedge mclk or negedge reset_n) begin
  if(reset_n == 1'b0) begin
    i <= 0;
	temp_pcm<=0;
	dout_pcm<=0;
  end
  else begin
    i<= i+1;
	if(i == (LAST_CYCLE-1) || i == (LAST_CYCLE*2-1) ||i == (LAST_CYCLE*3-1) || i == (LAST_CYCLE*4-1) || i == (LAST_CYCLE*5-1)||i == (LAST_CYCLE*6-1) ||i == (LAST_CYCLE*7-1)  ) temp_pcm <= temp_pcm + pcm_in;
	if(i == (LAST_CYCLE*8-1)) begin 
	  dout_pcm<= temp_pcm + pcm_in;
	  temp_pcm<=0;
	end
  end 
end
endmodule

图3 modelsim时域数据检测

图4 modelsim时域波形

图5 matlab还原数据的时域和频域

由图3,图4,和图5分析,1khz基本未发生改变,44.1khz相对于352.8khz采样率1khz点变得疏松。

DSP往期

音频总线I2S协议

信号的产生

信号的基本概念

滤波器的分类

基于LUT的DDS的设计

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

基于FPGA IIR数字滤波器的设计

本文分享自微信公众号 - FPGA开源工作室(leezym0317),作者:OpenSLee

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于FPGA的多级CIC滤波器实现四倍抽取一

    在实现多级CIC滤波器前我们先来了解滑动平均滤波器、微分器、积分器以及梳状滤波器原理。CIC滤波器在通信信号处理中有着重要的应用。

    FPGA开源工作室
  • 滤波器的分类

    滤波器是一种用来减少或者消除干扰的电气部件,其功能是对输入信号进行过滤处理得到所需的信号。

    FPGA开源工作室
  • 基于FPGA的多级CIC滤波器实现四倍抽取二

    在实现多级CIC滤波器前我们先来了解滑动平均滤波器、微分器、积分器以及梳状滤波器原理。CIC滤波器在通信信号处理中有着重要的应用。

    FPGA开源工作室
  • 用Python搭建一个校园维基网站(一)

    專 欄 ❈ treelake ,Python中文社区专栏作者 项目Github地址: https://github.com/zr777/school-wik...

    Python中文社区
  • 参加 HKOSC 2016 见闻

    这个拖了一个月才开始写,一部分原因是懒,开通了赞赏就没写了;还有就是想沉淀下,看看过这么久还有哪些是自己还印象深刻的。 HKOSC (Hong Kong Ope...

    温铭@APISIX
  • 独家 | 10 个简单小窍门带你提高Python数据分析速度(附代码)

    提示和技巧总是非常有用的,在编程领域更是如此。有时候,小小的黑科技可以节省你大量的时间和精力。一个小的快捷方式或附加组件有时会是天赐之物,可以成为实用的效率助推...

    数据派THU
  • 独家 | 10 个简单小窍门带你提高Python数据分析速度(附代码)

    提示和技巧总是非常有用的,在编程领域更是如此。有时候,小小的黑科技可以节省你大量的时间和精力。一个小的快捷方式或附加组件有时会是天赐之物,可以成为实用的效率助推...

    昱良
  • python - 遍历目录

    一门语言,如果知道了基本语法,知道输入输出、文件操作、数据库的操作、通信(socket等),基本上就可以开始开发了。剩下的知识就是在开发中慢慢学习与积累。这也是...

    phith0n
  • Dynamsoft Camera SDK 6.0发布,轻松捕捉图像和视频流

    Dynamsoft Camera SDK提供了Java api,使您可以轻松地从浏览器兼容的USB视频类(UVC)网络摄像头捕捉图像和视频流。 ? 使用基于浏览...

    BestSDK
  • WebWorker如何使用?

    Web Worker为Web内容在后台线程中运行脚本提供了一种简单的方法。线程可以执行任务而不干扰用户界面。

    CherishTheYouth

扫码关注云+社区

领取腾讯云代金券