123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- // libaudions.cpp : Defines the exported functions for the DLL application.
- //
- #ifdef _WIN32
- #include "stdafx.h"
- #endif
- #include "libaudions.h"
- #include "signal_processing_library.h"
- //默认是10ms的帧长度
- #ifndef RVC_NS_AUDIO_FRAME_TIME
- #define RVC_NS_AUDIO_FRAME_TIME 10
- #endif
- AudioNsImpl::AudioNsImpl(audions_callback_t* pCallback)
- {
- memcpy(&m_nscallback, pCallback, sizeof(audions_callback_t));
-
- m_NsHandle = NULL;
- if (0 != WebRtcNs_Create(&m_NsHandle)){
- NsLog("AudioNsImpl failed!");
- return;
- }
- m_audio_sample_rate = 16000;
- m_audio_capture_peroid = 20;
- m_ns_policy = 2;
- }
- AudioNsImpl::~AudioNsImpl()
- {
- if (NULL != m_NsHandle){
- WebRtcNs_Free(m_NsHandle);
- }
- }
- int AudioNsImpl::SetNsParams(uint32_t uSampleRate, uint32_t uAudioCapturePeroid, int iMode)
- {
- int iRet = -1;
- m_audio_sample_rate = uSampleRate;
- m_audio_capture_peroid = uAudioCapturePeroid;
- m_ns_policy = iMode;
- if (0 == WebRtcNs_Init(m_NsHandle, uSampleRate)){
- iRet = WebRtcNs_set_policy(m_NsHandle, iMode);
- if (0 != iRet){
- NsLog("WebRtcNs set policy failed.");
- }
- }
- else{
- NsLog("WebRtcNs Init failed.");
- }
- //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);
- return iRet;
- }
- int AudioNsImpl::NsProcess(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen)
- {
- int iRet = -1;
- switch(m_audio_sample_rate)
- {
- case 8000:
- iRet = NsProcess8kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen);
- break;
- case 16000:
- iRet = NsProcess16kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen);
- break;
- case 32000:
- iRet = NsProcess32kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen);
- break;
- case 48000:
- iRet = NsProcess48kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen);
- break;
- default:
- NsLog("Rvc_NsProcess not support audio sample rate.");
- break;
- }
- return iRet;
- }
- //8k采样率,采样间隔20ms,每次传过来音频大小为320字节,10ms缓冲区大小为160字节,WebRtcNs_Process每次处理10ms数据
- int AudioNsImpl::NsProcess8kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen)
- {
- int iRet = -1;
- if (NULL == pDst || pSrc == NULL){
- return iRet;
- }
- if ((uDstLen >= 320) && (320 == uSrcLen)){
- for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){
- short shBufferIn[80] = {0};
- short shBufferOut[80] = {0};
- memcpy(shBufferIn, (char*)pSrc+i*80*sizeof(short), sizeof(short)*80);
- if (iRet = WebRtcNs_Process(m_NsHandle ,shBufferIn ,NULL ,shBufferOut , NULL)){
- NsLog("Noise_Suppression WebRtcNs_Process 8k input err!");
- }
- else{
- memcpy((char*)pDst+i*80*sizeof(short),shBufferOut,80*sizeof(short));
- }
- }
- }
- else if ((160 == uDstLen) && (160 == uSrcLen)){
- iRet = WebRtcNs_Process(m_NsHandle, (short*)pSrc, NULL, (short*)pDst, NULL);
- }
- return iRet;
- }
- //16k采样率,采样间隔20ms,每次传过来音频大小为640字节,10ms缓冲区大小为320字节,WebRtcNs_Process每次处理10ms数据
- int AudioNsImpl::NsProcess16kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen)
- {
- int iRet = -1;
- if (NULL == pDst || pSrc == NULL){
- return iRet;
- }
- if ((640 == uDstLen) && (640 == uSrcLen)){
- for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){
- short shBufferIn[160] = {0};
- short shBufferOut[160] = {0};
- memcpy(shBufferIn, (char*)pSrc+i*160*sizeof(short), sizeof(short)*160);
- if (iRet = WebRtcNs_Process(m_NsHandle ,shBufferIn ,NULL ,shBufferOut , NULL)){
- NsLog("Noise_Suppression WebRtcNs_Process 16k input err!");
- }
- else{
- memcpy((char*)pDst+i*160*sizeof(short),shBufferOut,160*sizeof(short));
- }
- }
- }
- return iRet;
- }
- //32k采样率,采样间隔20ms,每次传过来音频大小为1280字节,10ms缓冲区大小为640字节,WebRtcNs_Process每次处理10ms数据
- int AudioNsImpl::NsProcess32kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen)
- {
- int iRet = -1;
- if (NULL == pDst || pSrc == NULL){
- return iRet;
- }
- int filter_state1[6] = {0}, filter_state12[6] = {0};
- int Synthesis_state1[6] = {0}, Synthesis_state12[6] = {0};
- if ((1280 == uDstLen) && (1280 == uSrcLen)){
- for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){
- short shBufferIn[320] = {0};
- short shInL[160]={0},shInH[160]={0};
- short shOutL[160] ={0},shOutH[160] = {0};
- memcpy(shBufferIn, pSrc + i*320*sizeof(short), 320*sizeof(short));
- //首先需要使用滤波函数将音频数据分高低频,以高频和低频的方式传入降噪函数内部
- WebRtcSpl_AnalysisQMF(shBufferIn,320,shInL,shInH,filter_state1,filter_state12);
- //将需要降噪的数据以高频和低频传入对应接口,同时需要注意返回数据也是分高频和低频
- if (iRet == WebRtcNs_Process(m_NsHandle, shInL, shInH, shOutL, shOutH)){
- NsLog("Noise_Suppression WebRtcNs_Process 32k input err!");
- }
- else
- {
- short shBufferOut[320] = {0};
- //如果降噪成功,则根据降噪后高频和低频数据传入滤波接口,然后用将返回的数据写入文件
- WebRtcSpl_SynthesisQMF(shOutL,shOutH,160,shBufferOut,Synthesis_state1,Synthesis_state12);
- memcpy(pDst+i*320*sizeof(short),shBufferOut,320*sizeof(short));
- }
- }
- }
- return iRet;
- }
- //48k采样率,采样间隔20ms,每次传过来音频大小为1920字节,10ms缓冲区大小为960字节,WebRtcNs_Process每次处理10ms数据
- int AudioNsImpl::NsProcess48kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen)
- {
- int iRet = -1;
- if (NULL == pDst || pSrc == NULL){
- return iRet;
- }
- int filter_state1[6] = {0}, filter_state12[6] = {0};
- int Synthesis_state1[6] = {0}, Synthesis_state12[6] = {0};
- if ((uDstLen >= 1920) && (1920 == uSrcLen)){
- for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){
- short shBufferIn[480] = {0};
- short shInL[240]={0},shInH[240]={0};
- short shOutL[240] ={0},shOutH[240] = {0};
- memcpy(shBufferIn, pSrc + i*480*sizeof(short), 480*sizeof(short));
- //首先需要使用滤波函数将音频数据分高低频,以高频和低频的方式传入降噪函数内部
- WebRtcSpl_AnalysisQMF(shBufferIn,480,shInL,shInH,filter_state1,filter_state12);
- //将需要降噪的数据以高频和低频传入对应接口,同时需要注意返回数据也是分高频和低频
- if (iRet == WebRtcNs_Process(m_NsHandle, shInL, shInH, shOutL, shOutH)){
- NsLog("Noise_Suppression WebRtcNs_Process 48k input err!");
- }
- else
- {
- short shBufferOut[480] = {0};
- //如果降噪成功,则根据降噪后高频和低频数据传入滤波接口,然后用将返回的数据写入文件
- WebRtcSpl_SynthesisQMF(shOutL,shOutH,240,shBufferOut,Synthesis_state1,Synthesis_state12);
- memcpy(pDst+i*480*sizeof(short),shBufferOut,480*sizeof(short));
- }
- }
- }
- return iRet;
- }
- void AudioNsImpl::NsLog(const char* fmt, ...)
- {
- if (m_nscallback.debug){
- va_list arg;
- va_start(arg, fmt);
- (*m_nscallback.debug)(m_nscallback.user_data, fmt, arg);
- va_end(arg);
- }
- }
- void AudioNsImpl::ReleaseObj()
- {
- //NsLog("AudioNsImpl ReleaseObj.");
- delete this;
- }
|