C#仿matlab函数进行语音降噪(有bug)
生活随笔
收集整理的這篇文章主要介紹了
C#仿matlab函数进行语音降噪(有bug)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.介紹
前段時間接到一個項目:偵聽調頻廣播,實現頻譜、瀑布圖顯示,話音播放、存儲及語音時域圖繪制。其中,話音播放時感覺其噪聲很大,必須對其降噪。在C#網上搜索了很多關于C#降噪的,沒搜到。利用MATLAB編寫降噪函數,并生成dll,但是發現調用Matlab的dll挺耗時的,所以不采用這種方式。于是我仿MATLAB降噪的函數,寫出了C#版降噪函數。播放的話音明顯實現了,但是其中有一個bug,就是降噪后會有噠噠噠的聲音,找了好久沒找到原因。如果能找出bug的兄弟,望告知一下。
二.代碼
1.低通濾波函數
2.降噪函數
// 說明:MATLAB轉C#函數private double[] NoiseReduction_T(Int16[] Indata, int Len, int Thre){// 定義返回數組,和輸入數據長度等長double[] Outdata = new double[Len];// 濾波器double[,] Filterdata = Lowpass_T(Indata, Len);// 設置窗口長度int Win = 256;for (int i = 0; i < Len / Win; i++){//將數據按Win長度分段處理double[] Windata = new double[Win];for (int m = 0; m < Win; m++){Windata[m] = Filterdata[i * Win + m, 0];}int sum = 0;//判斷每個Win長度數據中小于閾值Thre的數據個數for (int j = 0; j < Win; j++){if (Windata[j] < Thre){sum = sum + 1;}}// 如果大于250個 則認定為噪聲 并對這段Win長度數據歸零 如果不是噪聲 往后延續15段保證聲音連續if (sum > 250){for (int m = 0; m < Win; m++){Filterdata[i * Win + m, 0] = 0;}}else{i = i + 15;}}for (int i = 0; i < Len; i++){Outdata[i] = Filterdata[i, 0];}return Outdata;}3.降噪處理函數
// 自定義函數:降噪處理public byte[] DeNoise(byte[] sData, int nLen, int Fs, int Thre){// 長度:8192byte[] result = new byte[nLen];// 長度:4096Int16[] buffer_s = new Int16[nLen / 2];for (int i = 0; i < buffer_s.Length; i++){// 兩個字節轉為short(低位在前,高位在后)buffer_s[i] = BitConverter.ToInt16(new byte[] {sData[2 * i], sData[2 * i + 1] }, 0);}// 降噪處理:輸入(長度:4096)Int16[] array_In = buffer_s;// 降噪處理:輸出(長度:4096)double[] array_Out = NoiseReduction_T(array_In, buffer_s.Length, Thre);// 取出最后一個值(即索引為4096的值)for (int i = 0; i < array_Out.Length - 1; i++){sbyte[] tmp = TypeCast(array_Out[i]);result[i * 2] = (byte)tmp[0]; // 低位在前result[i * 2 + 1] = (byte)tmp[1]; // 高位在后}return result;}4.調用降噪處理函數
//降噪byte[] bytesDst = bytesSrc; bytesDst = m_NoiseReduct.DeNoise(bytesSrc, bytesSrc.Length, 31500, m_nThresholdDeNoise);總結
以上是生活随笔為你收集整理的C#仿matlab函数进行语音降噪(有bug)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你制作一个PWA应用教程
- 下一篇: Qt之天气预报——界面优化篇(含源码+注