求音频加减增益的算法

qingdaolibo 2010-12-26 03:13:29
通过DirectShow的SampleGrabber filter,我可以拿到音频PCM数据的buffer,但是如果对其做加减增益的处理,请高手帮忙,谢谢
...全文
948 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pp673802227 2013-07-23
  • 打赏
  • 举报
回复
请问有speex的增益降噪算法吗?
shangqt 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 shangqt 的回复:]
第一个参数是你每次speex_preprocess_run 做处理的sample个数,因为speex_preprocess_run函数没有指定buff长度的参数,所以需要在初始化时设定。
[/Quote]
自己的帖子居然无法编辑。。。。。
根据你的情况:“按照您说的方法,现在倒是有声音了,但是声音伴随着劈啦劈啦的杂音,而且声音的增益本身也没有变化” ,很有可能是你每次交给speex_preprocess_run的buff长度与你初始化时输入的长度不同导致的。
shangqt 2011-03-14
  • 打赏
  • 举报
回复
第一个参数是你每次speex_preprocess_run 做处理的sample个数,因为speex_preprocess_run函数没有指定buff长度的参数,所以需要在初始化时设定。
qingdaolibo 2011-01-06
  • 打赏
  • 举报
回复
Buffer是严格意义的PCM信号值
qingdaolibo 2011-01-06
  • 打赏
  • 举报
回复
还是不行呀,
frame_size = 48000/1000*10;
float q = 24000.0F;
pOutData是我从DirectShow里取出的Buffer,长度为4096
SpeexPreprocessState *st;
st = speex_preprocess_state_init(frame_size, 48000);
BYTE * p_SingleData =NULL;
hr = speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC, &y);
hr = speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC_LEVEL, &q);
hr = speex_preprocess_run(st, (spx_int16_t*)pOutData);
speex_preprocess_state_destroy(st);
如果frame_size = Buffer的长度,也就是4096,那就是没有声音,如果frame_size > 0 ,那么就会有劈啦劈啦声,如果frame_size = 0,程序就报错。这种情况应该和q是多少没有关系
hdq1115 2011-01-02
  • 打赏
  • 举报
回复
那肯定还是你的参数设定的有问题啊,自己再仔细检查检查吧
qingdaolibo 2010-12-31
  • 打赏
  • 举报
回复
按照您说的方法,现在倒是有声音了,但是声音伴随着劈啦劈啦的杂音,而且声音的增益本身也没有变化
hdq1115 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qingdaolibo 的回复:]

还是贴代码吧!!如下:
SpeexPreprocessState * st;
st = speex_preprocess_state_init(SampleSize/2,48000);
int i=1;
hr = speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC, &i);
f = 24000.0F;
hr = speex_……
[/Quote]
[Quote=引用 8 楼 qingdaolibo 的回复:]

现在的问题是,上述的代码在hr = speex_preprocess_run(st,(short*)pOutData);
执行之后pOutData都变成0了
[/Quote]

这个都变成零了,看下是不是参数设置的不正确,hr = speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC_LEVEL, &f); 有可能第二个参数设置的是错的,用另一个SET_AGC选项, 前辍也是 SPEEX_PREPROCESS_SET_AGC_XXXX,具体名字不太记得了,开发环境里面敲一下,有两个,选另一个试试,之前记得用一个会导致不发声的

祝好运!
hdq1115 2010-12-29
  • 打赏
  • 举报
回复
SpeexPreprocessState *speex_preprocess_state_init(int frame_size, int sampling_rate); 这个函数里面的参数自己注意看下Speex的编程API,frame_size是一帧语音时长的样本个数,和你的 sampleing_rate 有关,比如你sampling_rate取 48000,而语音是每 10ms一帧,则 frame_size应该是 ( 48000样本/s)*10ms=480,另外还有一个再次强调下: frame_size只是表示一帧语音时长对应的语音样本个数,每个语音样本用几个字节来表示是另一回事
qingdaolibo 2010-12-27
  • 打赏
  • 举报
回复
现在的问题是,上述的代码在hr = speex_preprocess_run(st,(short*)pOutData);
执行之后pOutData都变成0了
CyberLogix 2010-12-27
  • 打赏
  • 举报
回复
Speex里面有AGC语音增益的代码,你可参考下
qingdaolibo 2010-12-27
  • 打赏
  • 举报
回复
还是贴代码吧!!如下:
SpeexPreprocessState * st;
st = speex_preprocess_state_init(SampleSize/2,48000);
int i=1;
hr = speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC, &i);
f = 24000.0F;
hr = speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC_LEVEL, &f);
i=1;
hr = speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DENOISE, &i);
hr = speex_preprocess_run(st,(short*)pOutData);
speex_preprocess_state_destroy(st);
qingdaolibo 2010-12-27
  • 打赏
  • 举报
回复
现在还有个问题,就是SpeexPreprocessState *speex_preprocess_state_init(int frame_size, int sampling_rate);这个函数怎么调用?我的DirectShow 的 音频buffer是48000的采样率,buffer的大小是4096,参数是不是可以如下填写:SpeexPreprocessState *speex_preprocess_state_init(4096/2,48000),一直没琢磨明白,还请明白的人指点一下
AudioAEC 2010-12-26
  • 打赏
  • 举报
回复
对,Speex 可以对声音进行增强。
hdq123 2010-12-26
  • 打赏
  • 举报
回复
若还有疑问联系我: 扣扣 403174794。
hdq123 2010-12-26
  • 打赏
  • 举报
回复
有一款开源的编解码器 Speex 提供有语音前后端处理技术,有AGC语音增益处理啊,你看看
qingdaolibo 2010-12-26
  • 打赏
  • 举报
回复
打错字了,不是“如果”,是“如何”

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧