changxuding / Residual_Echo_Cancellation

Various Algorithm for Residual Echo Cancellation
MIT License
21 stars 6 forks source link

请教 speex 的 nlp ? #1

Closed zuowanbushiwo closed 1 year ago

zuowanbushiwo commented 1 year ago

我理解 st.yy 应该是指估计的回声,但从代码看像是error 信号,和 laec_out 是一样的了?对你另外一个工程 https://github.com/changxuding/Subband_Kalman_AEC/blob/main/saf_kalman.m#L127 有点不一样?谢谢!

changxuding commented 1 year ago

我理解 st.yy 应该是指估计的回声,但从代码看像是error 信号,和 laec_out 是一样的了?对你另外一个工程 https://github.com/changxuding/Subband_Kalman_AEC/blob/main/saf_kalman.m#L127 有点不一样?谢谢!

其实st.yy在这里赋的值也是估计的回声,st.err_adf的前半部分存的是error,后半部分存的是estEcho

zuowanbushiwo commented 1 year ago

非常感谢您的回复,刚刚仔细看了一下,理解了你上面的话了。 你这个算法的效果挺好的,比athena 的效果还好。 你用了两个nlp 吗? 还用了一个 kalman 的 H_res? 还问一个问题:求priSnr 中的那个计算公式 alpha 是怎么来的?我看athena 和 speex 中也看到了,但是没看到解释。

changxuding commented 1 year ago

非常感谢您的回复,刚刚仔细看了一下,理解了你上面的话了。 你这个算法的效果挺好的,比athena 的效果还好。 你用了两个nlp 吗? 还用了一个 kalman 的 H_res? 还问一个问题:求priSnr 中的那个计算公式 alpha 是怎么来的?我看athena 和 speex 中也看到了,但是没看到解释。

  1. 确实是把频域分块卡尔曼论文中的消残余回声的也用上了,相当于对残余回声消了两次;
  2. 我是这么理解,这里的dd公式里的alpha的计算中,残余回声越小就给予后验更大权重去更新priSNR,反之则更大权重给先验保持持续的抑制效果,这里使用的下边界系数0.2还是属于比较'激进'的;当然直接给alpha固定值会更方便
zuowanbushiwo commented 1 year ago

非常感谢大佬回复,还想请问一下如果非线性失真比较严重的时候,调试哪些参数比较用?手机端播放时候,音量最大,效果还是比较差的,这种情况应该是非线性失真比较多了。

changxuding commented 1 year ago

非常感谢大佬回复,还想请问一下如果非线性失真比较严重的时候,调试哪些参数比较用?手机端播放时候,音量最大,效果还是比较差的,这种情况应该是非线性失真比较多了。

最直接的像speex的leak可以对他进行增益调整,来控制你的最后的denoise gain,当然最好配合双讲的控制来避免近端失真太严重。 如果是音量过大饱和导致的失真,可以试试加一个非线性的映射在线性回声消除之前看看会不会有提高,像论文经常提到的sigmoid, raised cosine那些

zuowanbushiwo commented 1 year ago

感谢大佬的指点

最直接的像speex的leak可以对他进行增益调整,来控制你的最后的denoise gain,当然最好配合双讲的控制来避免近端失真太严重

这句话的意思是调下面的20参数? residual_echo = estEchoPsd * leak_estimate * 20

changxuding commented 1 year ago

感谢大佬的指点

最直接的像speex的leak可以对他进行增益调整,来控制你的最后的denoise gain,当然最好配合双讲的控制来避免近端失真太严重

这句话的意思是调下面的20参数? residual_echo = estEchoPsd * leak_estimate * 20

对,包括降噪里面的一些参数或者gain floor也可以调整一下

zuowanbushiwo commented 1 year ago

非常感谢大佬的回复,您真的是太热心了。 你代码gain floor 是哪个参数?是这个 st['echo_noise'] = np.maximum(0.85 * st['echo_noise'], residual_echo) 还是 st['gain'] = np.maximum(0.05, st['gain']) ? 我还以为你省略了,因为我看athena 和 speex 的源代码中都有一个 compute_gain_floor 类似的函数, 在您的代码中没有看到相应的变量和函数。 gain_floor 是什么意思? 这个的原理能解释一下吗? 有看到相关的文档吗?再次感谢大佬!

我看athena 和 speex 有考虑语音存在概率的,您的代码中没有考虑这些,是吗?

/* See EM and Cohen papers*/
/* Take into account speech probability of presence (loudness domain MMSE estimator) */

这两个是指的哪篇文章?我只 找到这篇 Speech Enhancement Using a Minimum Mean-Square Error Short-Time Spectral Amplitude Estimator 有点不一样。

changxuding commented 1 year ago

非常感谢大佬的回复,您真的是太热心了。 你代码gain floor 是哪个参数?是这个 st['echo_noise'] = np.maximum(0.85 * st['echo_noise'], residual_echo) 还是 st['gain'] = np.maximum(0.05, st['gain']) ? 我还以为你省略了,因为我看athena 和 speex 的源代码中都有一个 compute_gain_floor 类似的函数, 在您的代码中没有看到相应的变量和函数。 gain_floor 是什么意思? 这个的原理能解释一下吗? 有看到相关的文档吗?再次感谢大佬!

gain_floor就是gain的下边界,一般加在降噪的最后控制降噪的深度,这个值可以用speex那种方式计算也可以直接设置为定值(这里设定成0.05)

zuowanbushiwo commented 1 year ago

好的,了解了,感谢! 我看athena 和 speex 有考虑语音存在概率的,您的代码中没有考虑这些,是吗?

/* See EM and Cohen papers*/
/* Take into account speech probability of presence (loudness domain MMSE estimator) */

这两个是指的哪篇文章?我只 找到这篇 Speech Enhancement Using a Minimum Mean-Square Error Short-Time Spectral Amplitude Estimator 有点不一样。

changxuding commented 1 year ago

好的,了解了,感谢! 我看athena 和 speex 有考虑语音存在概率的,您的代码中没有考虑这些,是吗?

/* See EM and Cohen papers*/
/* Take into account speech probability of presence (loudness domain MMSE estimator) */

这两个是指的哪篇文章?我只 找到这篇 Speech Enhancement Using a Minimum Mean-Square Error Short-Time Spectral Amplitude Estimator 有点不一样。

这个主要还是消music noise的,在这里影响不大,可以参考“ Optimal speech enhancement under signal presence uncertainty using log-spectral amplitude estimator“, Cohen, and I.

zuowanbushiwo commented 1 year ago

感谢,祝您身体健康,工作(科研)顺利!