当前位置:网站首页>Speex Wiener filter and rewriting of hypergeometric distribution
Speex Wiener filter and rewriting of hypergeometric distribution
2022-04-23 19:28:00 【ToneChip】
At present, noise reduction algorithms are being studied
There is a paragraph about Wiener filtering and hypergeometric distribution, which takes a lot of time to calculate , Look at the original code PDIV32_16,SHL32,EXTEND32 Wait, these macro definitions look annoying , Let's use the original format directly float Of C Rewrite the language directly
The text is as follows
//N = 128; M = 24
for (i = 0; i < N; i++)
{
spx_word32_t MM;
spx_word32_t theta;
spx_word16_t prior_ratio;
spx_word16_t tmp;
spx_word16_t p;
spx_word16_t g;
/* Wiener filter gain Wiener filtering prior_snr= prior_snr /(prior_snr +1) */
prior_ratio = PDIV32_16(SHL32(EXTEND32(st->prior[i]), 15), ADD16(st->prior[i], SHL32(1, SNR_SHIFT)));
// Hypergeometric distribution gain parameter theta= prior_snr *(1+post_snr);
theta = MULT16_32_P15(prior_ratio, QCONST32(1.f, EXPIN_SHIFT) + SHL32(EXTEND32(st->post[i]), EXPIN_SHIFT - SNR_SHIFT));
/* Optimal estimator for loudness domain
Hypergeometric distribution gain MM=exp(-theta/2)*[(1+theta)*I0(theta/2)+theta*I1(theta/2)]; among I0 and I1 It's a Bessel function
*/
MM = hypergeom_gain(theta);
/* EM gain with bound gain g=min(1,prior_ratio*mm) */
g = EXTRACT16(MIN32(Q15_ONE, MULT16_32_Q15(prior_ratio, MM)));
/* Interpolated speech probability of presence */
p = st->gain2[i]; //gain2 It is the gain after the gain calculated from the critical frequency is extended to the linear frequency domain
/* Constrain the gain to be close to the Bark scale gain Limit Gain Values in Bark Domain gain
Constraint gain : If g/3>st->gain be g=3*st->gain
*/
if (MULT16_16_Q15(QCONST16(.333f, 15), g) > st->gain[i])
{
g = MULT16_16(3, st->gain[i]);
}
st->gain[i] = g; // If gain<gain_floor be gain =gain_floor
/* Save old power spectrum */
st->old_ps[i] = MULT16_32_P15(QCONST16(.2f, 15), st->old_ps[i]) + MULT16_32_P15(MULT16_16_P15(QCONST16(.8f, 15), SQR16_Q15(st->gain[i])), ps[i]);
/* Apply gain floor */
if (st->gain[i] < st->gain_floor[i])
{
st->gain[i] = st->gain_floor[i];
}
st->gain2[i] = powf(st->gain[i], p) * powf(st->gain_floor[i], 1.f - p); //=0.112ms
}
It was rewritten as follows
//N = 128; M = 24
for (i = 0; i < N; i++)
{
spx_word32_t MM;
spx_word32_t theta;
spx_word16_t prior_ratio;
spx_word16_t tmp;
spx_word16_t p;
spx_word16_t g;
/* Wiener filtering */
prior_ratio = st->prior[i] / (st->prior[i] + 1.0f);
// Hypergeometric distribution gain parameter
theta = prior_ratio * (1.0f + st->post[i]);
/* Optimal estimator for loudness domain
Hypergeometric distribution gain MM=exp(-theta/2)*[(1+theta)*I0(theta/2)+theta*I1(theta/2)]; among I0 and I1 It's a Bessel function
*/
MM = hypergeom_gain(theta);
/* EM gain with bound gain g=min(1,prior_ratio*mm) */
g = MIN32(Q15_ONE, prior_ratio * MM);
/* Interpolated speech probability of presence Calculate the weight or probability */
p = st->gain2[i]; //gain2 It is the gain after the gain calculated from the critical frequency is extended to the linear frequency domain
/* Constrain the gain to be close to the Bark scale gain Limit Gain Values in Bark Domain gain
Constraint gain : If g/3>st->gain be g=3*st->gain
*/
if ( (0.333f * g) > st->gain[i])
{
g = 3.0f * st->gain[i];
}
st->gain[i] = g; // If gain<gain_floor be gain =gain_floor
/* Save old power spectrum */
st->old_ps[i] = 0.2f * st->old_ps[i] + 0.8f * st->gain[i] * st->gain[i] * ps[i];
/* Apply gain floor */
if (st->gain[i] < st->gain_floor[i])
{
st->gain[i] = st->gain_floor[i];
}
/* Use this if you want a log-domain MMSE estimator instead */
/* Final amplitude spectral gain gain2={p*sqrt(g)+(1-p)*sqrt(st->gain_floor )}^2 */
gpio_output(GPIO37, 1);
st->gain2[i] = powf(st->gain[i], p) * powf(st->gain_floor[i], 1.f - p); //=0.112ms Occupy 85%
gpio_output(GPIO37, 0);
}
版权声明
本文为[ToneChip]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204231923488711.html
边栏推荐
- Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies
- Why is PostgreSQL about to surpass SQL Server?
- C语言的十六进制printf为何输出有时候输出带0xFF有时没有
- 【h264】libvlc 老版本的 hevc h264 解析,帧率设定
- OpenHarmony开源开发者成长计划,寻找改变世界的开源新生力!
- Main differences between go and PHP
- TI DSP的 FFT与IFFT库函数的使用测试
- Summary of several relationships of UML class diagram
- Intuitive understanding of the essence of two-dimensional rotation
- ArcMap publishing slicing service
猜你喜欢

Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies

Network protocol: SCTP flow control transmission protocol

Command - sudo

OpenHarmony开源开发者成长计划,寻找改变世界的开源新生力!

Common SQL commands

山大网安靶场实验平台项目—个人记录(四)

Using oes texture + glsurfaceview + JNI to realize player picture processing based on OpenGL es

NiO related Basics

Zero base to build profit taking away CPS platform official account

@MapperScan与@Mapper
随机推荐
命令-sudo
Web Security
JS calculation time difference
Network protocol: SCTP flow control transmission protocol
ArcGIS JS API dojoconfig configuration
Go three ways to copy files
Zero base to build profit taking away CPS platform official account
Class loading mechanism
A brief explanation of golang's keyword "competence"
MySQL lock
Parsing headless jsonarray arrays
坐标转换WGS-84 转 GCJ-02 和 GCJ-02转WGS-84
Machine learning catalog
C6748 软件仿真和硬件测试 ---附详细FFT硬件测量时间
openlayers 5.0 当地图容器大小改变时,重新加载地图
Pit encountered using camera x_ When onpause, the camera is not released, resulting in a black screen when it comes back
The flyer realizes page Jump through routing routes
Translation of audio signal processing and coding: Preface
Openharmony open source developer growth plan, looking for new open source forces that change the world!
[webrtc] add x264 encoder for CEF / Chromium