基于FPGA的音频处理芯片的设计

时间:2009-01-07 10:00:18 来源:维库电子市场 作者:刘虹 黄涛 徐成

1 引言

随着数字技术日益广泛的应用,以现场可编程门阵列FPGA(Field Programmable Gate Array)[1]为代表的ASIC[2]器件得到了迅速的普及和发展,器件的集成度和速度都在高速增长。FPGA既具有门阵列的高逻辑密度和高可靠性,又具有可编程逻辑器件的用户可编程性,可以减少系统的设计和维护的风险,降低产品成本,缩短设计周期。

目前,信号处理技术、通信技术和多媒体技术的迅猛发展都得益于DSP[3]技 术的广泛应用。但是对于便携式和家用的语音系统而言,基于一般的DSP芯片的设计方案并不理想。首先DSP的芯片成本以及开发成本在现阶段仍然是比较高 的,尤其是芯片成本,远远不及大批量ASIC芯片成本之低。其次便携式的设备对体积要求十分苛刻,限制了一部分DSP芯片的使用,而体积正是ASIC芯片 的优点之一。

本文提出了一种基于FPGA的音频处理芯片的硬件电路实现方案。由于对FIR滤波器的算法进行了改良,所以很大程度上减小了芯片的体积和降低了芯片的功耗。

2 算法研究与改良

2.1 普通FIR滤波算法

   N阶FIR滤波器可以用下面的线性卷积表示:[4]

x(n)是输入的音频序列,而y(n)是经过滤波后输出的音频序列,h(k)是N阶滤波器的系数。

简单的实现这个算法,需要N+1 次的乘法和N次的加法。所以至少需要一个硬件乘法器和一个定点或者浮点加法器来实现这个功能。由于音频处理芯片只需要做线性卷积,所以我们不需要采用乘法 器的结构。一般来说,由于乘法器庞大的结构,占用了芯片上的大部分面积,消耗用了大部分功率。而不使用乘法器的结构将会节约可观的芯片面积和功耗。为了实 现这种结构,我们需要改良FIR滤波算法。

2.2 改良滤波算法

首先,将滤波的系数h(k)用二进制表示法(POT,Power of Two)表示:

例如:h(k)=0.1172=2-3-2-7-2-16

我们给出7阶滤波器的一组系数,使用POT表示(精度小于10-4):

h(0) = 0.3761 = 2-1-2-3+2-10+2-13-2-15

h(1) = 0.3083 = 2-2+2-4-2-8-2-12

h(2) = -0.9424*10-1 = -2-3+2-5-2-11

h(3) = 0.6439*10-1 = 2-4+2-9-2-14

h(4) = -0.3308*10-1 = -2-5-2-9+2-13

h(5) = 0.1663*10-1 = 2-6+2-10+2-15

h(6) = -0.4135*10-2 = -2-8-2-12+2-16

h(7) = 0.1877*10-2 = 2-9-2-14-2-16

n=7时滤波器的输出值y如下:

y = (2-1-2-3+2-10+2-13-2-15) * x(7)

+(2-2+2-4-2-8-2-12) * x(6)

+(-2-3+2-5-2-11) * x(5)

+(2-4+2-9-2-14) * x(4)

+(-2-5-2-9+2-13) * x(3)

+(2-6+2-10+2-15) * x(2)

+(-2-8-2-12+2-16) * x(1)

+(2-9-2-14-2-16) * x(0)

很明显,x(n)的系数全部都是2的负k次幂,所以我们可以把具有相同系数的x(n)合并起来。

y(n)=2-1(...2-1(2-1(2-1u1+u2)+u3)+...)+u16)

uj=xj(1)+ xj(2)+……+ xj(rj)

其中1≤j≤16, xj(i)∈{x(n-k)}, 1≤i≤rj

由前面的系数,可以得到:

U1 = x(n-6)-x(n-7); U2 = -x(n)+x(n-5);

U3 = -x(n-3)-x(n-7); U4 = x(n)+x(n-4);

U5 = -x(n-1)-x(n-6); U6 = -x(n-2);

U7 = x(n)+x(n-5); U8 = x(n-3)-x(n-4)+x(n-7);

U5 = -x(n-1)-x(n-6); U10 = 0;

U11 = x(n-5); U12 = x(n-2)-x(n-4);

U13 = x(n-1)+x(n-3); U14 = -x(n)-x(n-2);

U15 = x(n-1); U16 = x(n);

按照这个算法,先求U1的值,然后将结果右移一位,再将结果与U2的值相加,依此类推,即可得到y(n)。我们使用若干次加法和16次移位操作即可完成FIR滤波,算法的复杂度和功耗都大大地降低。

3 音频处理芯片的设计

3.1 结构概述

在整个音频处理芯片的结构中,我们没有采用任何乘法器,取而代之的是一个加法器和移位器。加法器的结果输出到移位器,移位器的输出再反馈到加法器的输入端,循环运算实现滤波器的功能。

考 虑7阶的FIR滤波器,需要对x进行8次采样,所以输入的数据都应该保存在一个8*16的DataRAM之中(16bit的采样精度)。系数 RAM(ProgramRAM)的大小取决于操作的个数,在上面提到的算法中,一共有28个操作,所以ProgramRAM的大小不能小于28,在这里我 们使用了一个32*6的ProgramRAM,以满足算法需要。

考虑到音频处理芯片的可扩展性,我们在音频处理芯片外设置一个EEPROM用来存放系数,当芯片启动的时候,从EEPROM中将数据转存到ProgramRAM中,以适应不同FIR滤波器的系数,极大地增强了音频处理芯片的可编程性。

音频处理芯片的模块主要包括EEPROM, ProgramRAM, DataRAM,串并转换模块,并串转换模块,地址生成模块,主控制器模块。

3.2 寻址方式描述

在系统启动时,附加的EEPROM储存的系统参数值,包括输入信号在DataRAM中的地址值和相应的标志位(32*6bit) ,依次读入ProgramRAM中去。

其中,Zero,Sign,Shift分别为操作控制

Zero表示不加任何操作数

Sign表示加上负的操作数

Shift表示移位操作

而Virtual Address表示操作数的虚拟地址。

NO

Zero

Sign

Shift

Virtual Address

1

x(n-6)

0

0

0

001

2

-x(n-7)

0

1

1

000

3

-x(n)

0

1

0

111

4

x(n-5)

0

0

1

010

5

-x(n-3)

0

1

0

100

6

-x(n-7)

0

1

1

000

7

x(n)

0

0

0

111

8

x(n-4)

0

0

1

011

9

-x(n-1)

0

1

0

110

10

-x(n-6)

0

1

1

001

11

-x(n-2)

0

1

1

101

12

x(n)

0

0

0

111

13

x(n-5)

0

0

1

010

14

x(n-3)

0

0

0

100

15

-x(n-4)

0

1

0

011

16

x(n-7)

0

0

1

000

17

-x(n-1)

0

1

0

110

18

-x(n-6)

0

1

1

001

19

0

1

0

1

000

20

x(n-5)

0

0

1

010

21

x(n-2)

0

0

0

101

22

-x(n-4)

0

1

1

011

23

x(n-1)

0

0

0

110

24

x(n-3)

0

0

1

100

25

-x(n)

0

1

0

111

26

-x(n-2)

0

1

1

101

27

x(n-1)

0

0

1

110

28

x(n)

0

0

1

111

Base Address总是指向DataRAM中最早写入的值所在的地址,也就是x(n-7)的地址,而Virtual Address其他值相对于x(n-7)的地址,所以可以得出操作数在DataRAM中实际的地址:

Physical Address=BaseAddress+VirtualAddress

以y(n)=2-1(...2-1(2-1(2-1u1+u2)+u3)+...)+u16)中的u1为例

U1 = x(n-6) - x(n-7);

参数设置:C1= x(n-6)=000001

C2=-x(n-7)=011000

※最低的三位表示存储地址

※第4位表示移位标志,C2(4)为1表示计算出U1以后要右移得到2-1* U1

※第5位表示符号位,控制加减运算。C1(5)为0表示加, C2(5)为1表示减

※最高位,也就是第6位在Un=0时为1,这里只有C19(6)为1

3.3 端口描述

信号/端口

类型

宽度

功能

Clk

输入

1

系统时钟,16MHz

Reset

输入

1

系统重置,异步低有效。

Load

输入

1

系统启动时,将数据从EPROM中转存到ProgramRam中

Data_Clk

输入

1

数据时钟, 由ADC送入

Data_in

输入

1

采样信号的串行输入

FrameSync

输入

1

Date_in信号的帧控制信号

Data_out

输出

1

数据串行输出

CoeffData

输入

6

来自EEPROM的并行数据

CoeffAddress

输出

5

EEPROM地址信号

CoeffEnable

输出

1

EEPROM使能信号

3.4 模块设计

3.4.1 EEPROM [5]

·EEPROM用来存储系统参数

·EEPROM是32*6bit的存储阵列

·EEPROM的输入是Enable,Address(4 downto 0)

·EEPROM的输出是CoeffData(5 downto 0)

·EEPROM的首单元存放了操作的个数;例如,首单元存放"011100"表示一共有28个操作。

3.4.2 ProgramRAM [6]

·ProgramRAM接收EEPROM中的系统参数

·ProgramRAM是32*6bit的存储阵列

·ProgramRAM的输入是Write,Read,DataIn(5 downto 0),Address(4 downto 0)

·ProgramRAM的输出是Zero,Sign,Shift,DataAddr(2 downto 0)

3.4.3串并转换模块[7] (Serial2Parallel)

·Serial2Parallel接收来自ADC的串行数据、数据时钟和帧同步信号

·Serial2Parallel将串行输入信号转化为16bit的并行信号

·Serial2Parallel的输入是DataClk,DataIn,FrameSync

·Serial2Parallel的输出是DataOut(15 downto 0),DataOutSync

3.4.4并串转换输出模块[7] (Parallel2Serial)

•Parallel2Serial将并行信号转化为串行信号

•Parallel2Serial的输入是DataIn(15 downto 0),DataClk,FrameSync

•Parallel2Serial的输出是DataOut

3.4.5主控制器模块(Main Controller)

·主控制器模块是整个设计的核心,它协调控制着其他各个模块的工作

·主控制器模块是根据操作流程图设计的一个状态机

3.4.6 地址生成模块(AddressGen)

·PhysicalAddress实际上是一个加法器,将VirtualAddress与BaseAddress相加产生读地址

·BaseAddress实际上是一个计数器,IncreaseBase信号控制加1,产生写地址

·MUX选择读地址或者是写地址到DataRAM

4 音频处理芯片的仿真

4.1 仿真波形

4.2 仿真结果

通过程序,对一组输入序列进行了仿真结果比较,所获得的结果如表1所示。

表1:仿真结果比较

输入

期望值

仿真结果

01d7

00b1

00B1

01ef

014B

014B

02AF

016e

016E

024f

01a1

01A1

0093

00bc

00BD

00e7

0070

0070

0029

005e

005E

ff55

ffb6

FFB6

fe99

ff52

FF52

fec9

ff28

FF28

0025

ffc7

FFC7

00f7

0074

0074

通过表1可以看出音频处理芯片达到了预期的设计目标,效果良好。

可以看到,期望值和仿真结果在最后一位会有±1的误差,这是由于我们采用的移位算法将最后一位移出时不进行四舍五入造成的。经过计算,这种误差不会影响FIR的精度。

5 结束语

本文设计的音频处理芯片主要实现FIR滤波器功能,可以满足较为简单的语音信号处理的需要。用POT系数表示方法来表示系统参数,用一个加法器和一个移位寄存器实现乘法器的功能,这样在面积功耗上就有相当大的优势。设计过程是采用自顶向下的设计方法。最终的仿真结果符合预期的要求

基于FPGA的音频处理芯片的设计相关推荐

  1. 基于FPGA的简易DDS信号发生器的设计(一)

    写这篇文章的本意不是为了探讨AD9767怎么使用,因为9767的控制实在是太简单了,准备好数据直接输出即可,和网上大多数的并行DA输出基本上一模一样,更麻烦的反而是硬件方面.发文的原因是最近一位很细心 ...

  2. 基于FPGA的CAN总线控制器的设计(下)

    今天给大侠带来基于FPGA的CAN总线控制器的设计,由于篇幅较长,分三篇.今天带来第三篇,下篇,程序的仿真与测试以及总结.话不多说,上货. 导读 CAN 总线(Controller Area Netw ...

  3. 基于 FPGA 的模拟 I²C协议设计(中)

    今天给大侠带来基于FPGA的 模拟 I²C 协议设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,I²C 协议的具体实现.话不多说,上货. 之前也有相关文章介绍,这里超链接一下,仅供各位大侠参考. 源 ...

  4. 基于FPGA的双路低频信号发生器设计

    基于FPGA的双路低频信号发生器设计 系统结构框 本设计是以Altera公司的可编程芯片做载体,运用Verilog作为软件设计工具,从而实现DDS原理,即信号发生器的核心思想.再加上信号发生器的硬件电 ...

  5. 基于FPGA的CAN总线控制器的设计(上)

    今天给大侠带来基于FPGA的CAN总线控制器的设计,由于篇幅较长,分三篇.今天带来第一篇,上篇,CAN 总线协议解析以及 CAN 通信控制器程序基本框架.话不多说,上货. 导读 CAN 总线(Cont ...

  6. 基于FPGA的简易DDS信号发生器的设计与验证

    基于FPGA的简易DDS信号发生器的设计与验证 一,理论介绍 补充:举例理解 二,代码实现 1,实验目标 2,MATLAB代码 3,verilog代码及实现思路 一,理论介绍 DDS 是直接数字式频率 ...

  7. 基于FPGA的除法器原理介绍及设计实现

    基于FPGA的除法器原理介绍及设计实现 引言应用 在FPGA的设计应用领域里,许多电路需要用到除法器,而在硬件描述语言里却没有直接的除法器"%","/"可以直接 ...

  8. linux 音频播放器源码,基于Linux的音频播放器的设计 源代码.doc

    嵌入式操作系统 课程设计 源代码 设计题目: 基于Linux的音频播放器的设计 院 系: ********* 班 级: ******** 组 别: 第1组 学 号: ****** 姓 名: 起止日期: ...

  9. 基于FPGA的时间数字转换(TDC)设计(五:基于Carry4的高精度TDC设计)

    1.基于Carry4进位链设计原理 常见的基于FPGA开发的TDC有直接计数法,多相位时钟采样法,抽头延迟线法等,之前内容为基于多相位的TDC,本章节中,主要讲解基于抽头延迟线法.在Xilinx FP ...

最新文章

  1. 常用深度学习框——Caffe/TensorFlow / Keras/ PyTorch/MXNet
  2. WSAStartup函数
  3. python中文注释缩进_Python入门学习之注释、行与缩进
  4. Java8 CountDownLatch 源码分析
  5. MVC基础知识-View
  6. 人工智能在语音和数字图像处理领域有哪些具体化应用_智能呼叫中心系统有哪些优势...
  7. 施一公直播首秀来了!解答读博困惑,鼓励学生勇敢申请西湖大学
  8. springcloud feign 服务调用其他服务_微服务实战——SpringCloud与Feign集成
  9. RS232和RS485
  10. Deepin Linux已经做得相当不错了
  11. 手动编译cloudfoundry
  12. linux内核3,升级linux内核到3.10
  13. 退出登入的php怎么写,php中退出登录怎么写
  14. 注解配置springMvc及向作用域中赋值
  15. Jvisualvm监控远程SpringBoot项目
  16. CAD如何一键解决批量打印
  17. java 中英文长度_Java--计算中英文长度的若干种方法
  18. MATLAB机器人工具箱使用
  19. 数据结构——什么是数据结构?
  20. github下载加速的几种方法

热门文章

  1. MySql中设置时区为东八区
  2. FATFS文件系统的中文长文件名配置的几个注意事项
  3. 20171119 - 2.01x - Week 4
  4. ubuntu20.04上openvino安装及环境配置
  5. 一个外键对应多条数据的删除
  6. 详述java的File类常用方法
  7. 微信JS-SDK集成与使用
  8. win11外接显示器没反应怎么办
  9. 群晖双网口虚拟机openwrt主路由二级路由拨号上网配置
  10. numpy.matmul()函数