libaudions.cpp 7.2 KB

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