SHARC音频DSP的算法详解(十)All Pass - Canonical (全通滤波器)算法的实现及代码详解

硬件准备

ADSP-21489EVB:ADI 21489 DSP的开发板
在这里插入图片描述

AD-HP530ICE:ADI DSP通用仿真器

在这里插入图片描述

软件准备

Visual DSP++

算法功能

实现全通滤波功能,声音信号经过该滤波器以后频谱幅度不变,仅改变相位,即产生延时。

原理简介

下图为全通滤波器的一种网络结构:

在这里插入图片描述

其差分方程为:

在这里插入图片描述

系统函数:

在这里插入图片描述

资源占用(MIPS, Memory requirement)

Memory: 数据段(段名 AllPassFilterC_dmda)
(D + 2)words (字长 32bits)
D 指延时线长度

代码段(段名 AllPassFilterC_pmco)
0x71words (字长 48bits)
MFLOPS(处理 1 个输入数据): AllPassFilterC 函数,0.0007

相关函数

函数一:void InitAllPassFilterC( float *DlyBuf, int *BufIndex, int
BufSize );

1.函数说明:初始化函数,将延时线的数据置零。
2.输入参数:
*DlyBuf 延时线指针
*BufIndex 对延时线进行数据操作的索引值
BufSize 延时线长度
3.输出参数:无
4.返回值:无。

函数二:int AllPassFilterC(int *in, int *out, float *DlyBuf, int *BufIndex,
float *Gain, int DelayNum);

1.函数说明:对单声道的输入,进行全通滤波处理。
2.输入参数:
in 输入数据指针。
*in 为单声道数据;
数据范围:int 类型表示的范围
DlyBuf 延时线指针。
Gain 增益系数
数据范围: 0 ≤ *Gain < 1
DelayNum 延时线长度。
数据范围:在存储空间允许的范围内根据需要设定;

3.输出参数:
out 输出数据指针。
*out 为单声道的输出数据;
数据范围:int 类型表示的范围
4.返回值: 0 为正常;1 增益参数超范围

应用举例

首先将 AllPassFilterC.dlb, AllPassFilterC.h 两个文件拷贝到自己的工程目录下,然后将它 们 添 加 到 工 程 中 ; 然 后 在 LDF 文 件 中 给 数 据 段 AllPassFilterC_dmda 、 程 序 段AllPassFilterC_pmco 分配空间,接下来再写相关代码。

#include “AllPassFilterC.h”
/******************************************************************************

  • 调用 AllPassFilterC.dlb 库函数需定义的参数
    */
    #define D 4800 // 定义延时缓冲区大小 TD = D/fs = 4800/48000 = 0.1 sec */
    #pragma section (“AllPassFilterC_dmda”)
    int DelayBufIndex; // 往延时缓冲区写数据的索引值
    #pragma section (“AllPassFilterC_dmda”)
    float w[D + 1]; // 延时缓冲区
    #pragma section (“AllPassFilterC_dmda”)
    float GainCoef = 0.5; // 增益系数
    /
    /
    // 第一次调用延时函数的标志
    int FirstAllPassFilterCFlag = 1;
    // 输入输出数据的临时变量
    int InputLR;
    int OutputLR[2];
    int InputData;
    int OutputData;
    // 第一次调用全通滤波函数之前先做初始化工作
    if (FirstAllPassFilterCFlag)
    {
    InitAllPassFilterC( w, &DelayBufIndex, D);
    FirstAllPassFilterCFlag = 0;
    }
    for (i=0; i<NUM_SAMPLES; i++)
    {
    //取左声道数据
    InputData = (block_ptr+2i); // block_ptr 是 A/D D/A 收发数据的指针

//对输入数据进行 Stero Chorus 处理
ReturnValue = AllPassFilterC(&InputData, &OutputData, w, &DelayBufIndex,
&GainCoef, D);

//将处理后的输出数据传给 D/A
(block_ptr+2i) = OutputData;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ADI_OP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值