大家好,欢迎来到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