libaudions.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. // libaudions.cpp : Defines the exported functions for the DLL application.
  2. //
  3. #ifdef _WIN32
  4. #include "stdafx.h"
  5. #endif
  6. #include "libaudions.h"
  7. #include "signal_processing_library.h"
  8. //默认是10ms的帧长度
  9. #ifndef RVC_NS_AUDIO_FRAME_TIME
  10. #define RVC_NS_AUDIO_FRAME_TIME 10
  11. #endif
  12. AudioNsImpl::AudioNsImpl(audions_callback_t* pCallback)
  13. {
  14. memcpy(&m_nscallback, pCallback, sizeof(audions_callback_t));
  15. m_NsHandle = NULL;
  16. if (0 != WebRtcNs_Create(&m_NsHandle)){
  17. NsLog("AudioNsImpl failed!");
  18. return;
  19. }
  20. m_audio_sample_rate = 16000;
  21. m_audio_capture_peroid = 20;
  22. m_ns_policy = 2;
  23. }
  24. AudioNsImpl::~AudioNsImpl()
  25. {
  26. if (NULL != m_NsHandle){
  27. WebRtcNs_Free(m_NsHandle);
  28. }
  29. }
  30. int AudioNsImpl::SetNsParams(uint32_t uSampleRate, uint32_t uAudioCapturePeroid, int iMode)
  31. {
  32. int iRet = -1;
  33. m_audio_sample_rate = uSampleRate;
  34. m_audio_capture_peroid = uAudioCapturePeroid;
  35. m_ns_policy = iMode;
  36. if (0 == WebRtcNs_Init(m_NsHandle, uSampleRate)){
  37. iRet = WebRtcNs_set_policy(m_NsHandle, iMode);
  38. if (0 != iRet){
  39. NsLog("WebRtcNs set policy failed.");
  40. }
  41. }
  42. else{
  43. NsLog("WebRtcNs Init failed.");
  44. }
  45. //NsLog("audio sample rate is %d, audio frame time is %dms, noise suppression policy is %d.",m_audio_sample_rate, m_audio_capture_peroid, m_ns_policy);
  46. return iRet;
  47. }
  48. int AudioNsImpl::NsProcess(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen)
  49. {
  50. int iRet = -1;
  51. switch(m_audio_sample_rate)
  52. {
  53. case 8000:
  54. iRet = NsProcess8kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen);
  55. break;
  56. case 16000:
  57. iRet = NsProcess16kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen);
  58. break;
  59. case 32000:
  60. iRet = NsProcess32kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen);
  61. break;
  62. case 48000:
  63. iRet = NsProcess48kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen);
  64. break;
  65. default:
  66. NsLog("Rvc_NsProcess not support audio sample rate.");
  67. break;
  68. }
  69. return iRet;
  70. }
  71. //8k采样率,采样间隔20ms,每次传过来音频大小为320字节,10ms缓冲区大小为160字节,WebRtcNs_Process每次处理10ms数据
  72. int AudioNsImpl::NsProcess8kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen)
  73. {
  74. int iRet = -1;
  75. if (NULL == pDst || pSrc == NULL){
  76. return iRet;
  77. }
  78. if ((uDstLen >= 320) && (320 == uSrcLen)){
  79. for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){
  80. short shBufferIn[80] = {0};
  81. short shBufferOut[80] = {0};
  82. memcpy(shBufferIn, (char*)pSrc+i*80*sizeof(short), sizeof(short)*80);
  83. if (iRet = WebRtcNs_Process(m_NsHandle ,shBufferIn ,NULL ,shBufferOut , NULL)){
  84. NsLog("Noise_Suppression WebRtcNs_Process 8k input err!");
  85. }
  86. else{
  87. memcpy((char*)pDst+i*80*sizeof(short),shBufferOut,80*sizeof(short));
  88. }
  89. }
  90. }
  91. else if ((160 == uDstLen) && (160 == uSrcLen)){
  92. iRet = WebRtcNs_Process(m_NsHandle, (short*)pSrc, NULL, (short*)pDst, NULL);
  93. }
  94. return iRet;
  95. }
  96. //16k采样率,采样间隔20ms,每次传过来音频大小为640字节,10ms缓冲区大小为320字节,WebRtcNs_Process每次处理10ms数据
  97. int AudioNsImpl::NsProcess16kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen)
  98. {
  99. int iRet = -1;
  100. if (NULL == pDst || pSrc == NULL){
  101. return iRet;
  102. }
  103. if ((640 == uDstLen) && (640 == uSrcLen)){
  104. for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){
  105. short shBufferIn[160] = {0};
  106. short shBufferOut[160] = {0};
  107. memcpy(shBufferIn, (char*)pSrc+i*160*sizeof(short), sizeof(short)*160);
  108. if (iRet = WebRtcNs_Process(m_NsHandle ,shBufferIn ,NULL ,shBufferOut , NULL)){
  109. NsLog("Noise_Suppression WebRtcNs_Process 16k input err!");
  110. }
  111. else{
  112. memcpy((char*)pDst+i*160*sizeof(short),shBufferOut,160*sizeof(short));
  113. }
  114. }
  115. }
  116. return iRet;
  117. }
  118. //32k采样率,采样间隔20ms,每次传过来音频大小为1280字节,10ms缓冲区大小为640字节,WebRtcNs_Process每次处理10ms数据
  119. int AudioNsImpl::NsProcess32kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen)
  120. {
  121. int iRet = -1;
  122. if (NULL == pDst || pSrc == NULL){
  123. return iRet;
  124. }
  125. int filter_state1[6] = {0}, filter_state12[6] = {0};
  126. int Synthesis_state1[6] = {0}, Synthesis_state12[6] = {0};
  127. if ((1280 == uDstLen) && (1280 == uSrcLen)){
  128. for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){
  129. short shBufferIn[320] = {0};
  130. short shInL[160]={0},shInH[160]={0};
  131. short shOutL[160] ={0},shOutH[160] = {0};
  132. memcpy(shBufferIn, pSrc + i*320*sizeof(short), 320*sizeof(short));
  133. //首先需要使用滤波函数将音频数据分高低频,以高频和低频的方式传入降噪函数内部
  134. WebRtcSpl_AnalysisQMF(shBufferIn,320,shInL,shInH,filter_state1,filter_state12);
  135. //将需要降噪的数据以高频和低频传入对应接口,同时需要注意返回数据也是分高频和低频
  136. if (iRet == WebRtcNs_Process(m_NsHandle, shInL, shInH, shOutL, shOutH)){
  137. NsLog("Noise_Suppression WebRtcNs_Process 32k input err!");
  138. }
  139. else
  140. {
  141. short shBufferOut[320] = {0};
  142. //如果降噪成功,则根据降噪后高频和低频数据传入滤波接口,然后用将返回的数据写入文件
  143. WebRtcSpl_SynthesisQMF(shOutL,shOutH,160,shBufferOut,Synthesis_state1,Synthesis_state12);
  144. memcpy(pDst+i*320*sizeof(short),shBufferOut,320*sizeof(short));
  145. }
  146. }
  147. }
  148. return iRet;
  149. }
  150. //48k采样率,采样间隔20ms,每次传过来音频大小为1920字节,10ms缓冲区大小为960字节,WebRtcNs_Process每次处理10ms数据
  151. int AudioNsImpl::NsProcess48kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen)
  152. {
  153. int iRet = -1;
  154. if (NULL == pDst || pSrc == NULL){
  155. return iRet;
  156. }
  157. int filter_state1[6] = {0}, filter_state12[6] = {0};
  158. int Synthesis_state1[6] = {0}, Synthesis_state12[6] = {0};
  159. if ((uDstLen >= 1920) && (1920 == uSrcLen)){
  160. for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){
  161. short shBufferIn[480] = {0};
  162. short shInL[240]={0},shInH[240]={0};
  163. short shOutL[240] ={0},shOutH[240] = {0};
  164. memcpy(shBufferIn, pSrc + i*480*sizeof(short), 480*sizeof(short));
  165. //首先需要使用滤波函数将音频数据分高低频,以高频和低频的方式传入降噪函数内部
  166. WebRtcSpl_AnalysisQMF(shBufferIn,480,shInL,shInH,filter_state1,filter_state12);
  167. //将需要降噪的数据以高频和低频传入对应接口,同时需要注意返回数据也是分高频和低频
  168. if (iRet == WebRtcNs_Process(m_NsHandle, shInL, shInH, shOutL, shOutH)){
  169. NsLog("Noise_Suppression WebRtcNs_Process 48k input err!");
  170. }
  171. else
  172. {
  173. short shBufferOut[480] = {0};
  174. //如果降噪成功,则根据降噪后高频和低频数据传入滤波接口,然后用将返回的数据写入文件
  175. WebRtcSpl_SynthesisQMF(shOutL,shOutH,240,shBufferOut,Synthesis_state1,Synthesis_state12);
  176. memcpy(pDst+i*480*sizeof(short),shBufferOut,480*sizeof(short));
  177. }
  178. }
  179. }
  180. return iRet;
  181. }
  182. void AudioNsImpl::NsLog(const char* fmt, ...)
  183. {
  184. if (m_nscallback.debug){
  185. va_list arg;
  186. va_start(arg, fmt);
  187. (*m_nscallback.debug)(m_nscallback.user_data, fmt, arg);
  188. va_end(arg);
  189. }
  190. }
  191. void AudioNsImpl::ReleaseObj()
  192. {
  193. //NsLog("AudioNsImpl ReleaseObj.");
  194. delete this;
  195. }