diff --git a/lib/talk/call/g711.dart b/lib/talk/call/g711.dart index d848bede..dfc331be 100755 --- a/lib/talk/call/g711.dart +++ b/lib/talk/call/g711.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:math'; import 'package:flutter/services.dart'; class G711 { @@ -20,6 +21,67 @@ class G711 { return (aVal & 0x80) != 0 ? 0x84 - t : t - 0x84; } + int decodeG711(int encodedValue, bool isALaw) { + if (isALaw) { + // A律解码 + encodedValue = ~encodedValue; + int t = ((encodedValue & 0x0F) << 3) + 0x84; + t <<= (encodedValue & 0x70) >> 4; + return (encodedValue & 0x80) != 0 ? 0x84 - t : t - 0x84; + } else { + // μ律解码 + encodedValue = ~encodedValue; + int t = ((encodedValue & 0x0F) << 3) + 0x84; + t <<= (encodedValue & 0x70) >> 4; + return (encodedValue & 0x80) != 0 ? 0x84 - t : t - 0x84; + } + } + + /// 高通滤波 + List highPassFilter( + List audioData, int sampleRate, double cutoffFreq) { + final double rc = 1.0 / (2 * pi * cutoffFreq); + final double dt = 1.0 / sampleRate; + final double alpha = rc / (rc + dt); + + List filteredData = []; + int prevInput = 0; + int prevOutput = 0; + + for (int sample in audioData) { + int output = (alpha * (prevOutput + sample - prevInput)).round(); + filteredData.add(output); + prevInput = sample; + prevOutput = output; + } + + return filteredData; + } + + /// 噪声门 + List noiseGate(List audioData, int threshold) { + return audioData + .map((sample) => sample.abs() > threshold ? sample : 0) + .toList(); + } + + /// 解码并降噪 + List decodeAndDenoise(List encodedData, bool isALaw, int sampleRate, + double cutoffFreq, int threshold) { + // 解码 G.711 数据 + List decodedData = + encodedData.map((value) => decodeG711(value, isALaw)).toList(); + + // 高通滤波 + List filteredData = + highPassFilter(decodedData, sampleRate, cutoffFreq); + + // 噪声门 + List denoisedData = noiseGate(filteredData, threshold); + + return denoisedData; + } + //711解码为pcm数据 List convertList(List aLawList) { // 将 ALawToLinear 函数应用于 List