SHARC音频DSP的算法详解(十九)Noise Gate 算法(噪声门)的实现及代码详解

SHARC音频DSP的算法详解(十九)Noise Gate 算法(噪声门)的实现及代码详解ADI 的 SHARCDSP 实现对信号的噪声门限进行自动识别 当输入信号电平超过阈值电平时 信号通过 当输入信号电平低于阈值电平时 不让信号通过

大家好,欢迎来到IT知识分享网。

硬件准备

ADSP-21489EVB:ADI 21489 DSP的开发板

产品链接:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-5192690539.13.3cd16938GrbRa1&id=539694123232

在这里插入图片描述

AD-HP530ICE:ADI DSP通用仿真器

产品链接:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-5192690539.11.27e0bfa3NS4TTS&id=38007242820

在这里插入图片描述

软件准备

Visual DSP++

算法功能

实现对信号的噪声门限进行自动识别,当输入信号电平超过阈值电平时,信号通过;当输入信号电平低于阈值电平时,不让信号通过。

原理简介

噪声门的工作原理如图所示:

在这里插入图片描述

框图如下:

在这里插入图片描述

当检测到输入信号的电平小于设定的阈值,则增益 Gn 为 0,否则增益 Gn 为 1。 有三个参数:
1.阈值电平(门槛电平)
3.起控时间
4.释放时间
本算法程序中目前只有第一个参数起作用,后两个参数有待增加。

资源占用(MIPS, Memory requirement)

在这里插入图片描述

相关函数

函数一:Void InitNoiseGate( float *DlyBufPtrL,float *DlyBufPtrR, int *BufIndex, int *BufSize )

1.函数说明:初始化函数,将缓冲区及相关变量置零。

2.输入参数:
DlyBufPtrL 左缓冲区指针
DlyBufPtrR 右缓冲区指针
BufIndex 对缓冲区进行数据操作的索引值
*BufIndex 左声道索引值
*(BufIndex + 1)右声道索引值
BufSize 缓冲区长度
*BufSize 左缓冲区长度
*(BufSize + 1)右缓冲区长度

函数二:int NoiseGate(int *in, int *out, float *DlyBufL,float *DlyBufR, int *BufIndex, float *threshold, int *BufSize)

1.函数说明:对输入信号进行电平检测,与设定的阈值电平对比,以确定信号是否通过。

2.输入参数:
in 输入数据指针。
*in 为左声道数据;
*(in+1)为右声道数据;
数据范围:int 类型表示的范围
DlyBufPtrL 左缓冲区指针
DlyBufPtrR 右缓冲区指针
BufIndex 对缓冲区进行数据操作的索引值
*BufIndex 左声道索引值
*(BufIndex + 1)右声道索引值
BufSize 缓冲区长度
*BufSize 左缓冲区长度
*(BufSize + 1)右缓冲区长度
Threshold 阈值

  • threshold 左声道阈值
    *(threshold + 1) 右声道阈值
    数据范围: 0 ≤ 阈值 ≤ 0.5

3.输出参数:
out 输出数据指针。
*out 为左声道的输出数据;
*(out+1)为右声道的输出数据;
数据范围:int 类型表示的范围

应用举例

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

  • 调用 Compressor.dlb 库函数需定义的参数
    */
    // 定义阈值
    #define THRESHOLD_L 0.06
    #define THRESHOLD_R 0.06
    // 定义缓冲区大小
    #define DL 500
    #define DR 500
    #pragma section (“NoiseGate_dmda”)
    float threshold[2] = {THRESHOLD_L,THRESHOLD_R};
    // 定义左右声道用于存储 RMS 值的缓冲区
    #pragma section (“NoiseGate_dmda”)
    float RMS_BufL[DL];
    #pragma section (“NoiseGate_dmda”)
    float RMS_BufR[DR];
    // 往延时缓冲区写数据的索引值
    #pragma section (“NoiseGate_dmda”)
    int DelayBufIndex[2];
    #pragma section (“NoiseGate_dmda”)
    int BufSize[2] = {DL,DR};
    /
    /
    // 第一次调用延时函数的标志
    int FirstNoiseGateFlag = 1;
    // 输入输出数据的临时变量
    int InputLR;
    int OutputLR;
    int InputData[2];
    int OutputData[2];
    // 第一次调用噪声门函数之前先做初始化工作
    if (FirstNoiseGateFlag)
    {

    InitNoiseGate( RMS_BufL,RMS_BufR, DelayBufIndex, BufSize);
    FirstNoiseGateFlag = 0;
    }
    for (i=0; i<NUM_SAMPLES; i++)
    {

    //取左右声道数据
    InputData[0] = (block_ptr+2i); // block_ptr 是 A/D D/A 收发数据的指针
    InputData[1] = (block_ptr+2i + 1);
    //对输入数据进行处理
    NoiseGate(InputData, OutputData, RMS_BufL,RMS_BufR,DelayBufIndex,threshold,
    BufSize);
    //将处理后的输出数据传给 D/A
    (block_ptr+2i) = OutputData[0];
    (block_ptr+2i + 1) = OutputData[1];

}

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/144133.html

(0)
上一篇 2025-04-28 19:20
下一篇 2025-04-28 19:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信