从音频数据到TPCircularBuffer和音频单元的数据转换,以过滤心跳声

问题描述 投票:0回答:1

在我的 iOS 应用程序中,使用 swift

我正在从数字健康设备 (BLE) 获取音频。以音频数据的形式,听到心跳声。

  1. 我们有 ADPCM 解码文件。我们已经使用 ADPCM 解码器进行了解码。

ADPCM 解码文件

我们想从中消除背景噪音。

2. 为此,我们使用苹果的 DSP 代码应用低通滤波器和高通滤波器。经过过滤后,我们得到了浮动样本。

Apple 的 DSP 代码

  let samples = convertUInt8ToFloats(sampleData: audioData)
  let samples1 =  musicProvider.loadAudioSamples(samples: samples)

   musicProvider.selectedSectionIndex = 0
   musicProvider.parameters.first?.filterType = .lowpass
   musicProvider.parameters.first?.frequency = 187.5
   musicProvider.parameters.first?.Q = 0.707
   musicProvider.parameters.first?.dbGain = 0.0
   musicProvider.setSelectedSectionCoefficients()


   var signal = getSignalElement()
   while (signal != 0) {
     signal = getSignalElement()
 }


// Code in viewDidLoad
         func convertUInt8ToFloats(sampleData: Data) -> [Float] {
    
        let factor = Float(UInt8.max)
        let samples = sampleData.withUnsafeBytes {
            UnsafeBufferPointer<UInt8>(start: $0, count: sampleData.count / MemoryLayout<UInt8>.size)
        }
        var floats: [Float] = Array(repeating: 0.0, count: samples.count)
        for i in 0..<samples.count {
            floats[i] = Float(samples[i]) / factor
        }
        return floats
    }
  1. 我们正在使用 TPCircularBuffer 和音频单元播放音频。 在 TPCircularBuffer 中,我出现失真或噪音。在音频单元中,我将格式设置为 LinearPCM 和 16 位数据。

如何将数据从浮点数组传递到 TPCircularBuffer ?

如何在 TPCircular 缓冲区中传递数据?

在演示项目中代码是这样的

//字节数组的播放方法 func getSignalElement() -> Int { var 最后数据 = 数据() 让信号= musicProvider.getSignal() 对于信号中的信号{ 让 uInt8 = iirFilterNew.convertDoubleToUInt8(Double(信号)) 最后数据.append(uInt8) }

    let i16array = lastData.withUnsafeBytes {  bufferPointer in
        TPCircularBufferProduceBytes(iosAudio.addressOfTPBuffer(),
                                         bufferPointer.baseAddress,
                                         UInt32(bufferPointer.count));
     }
    return signals.count
}

  //Code for conversion of Float to Double
   func convertDoubleToUInt8(value: Double) -> UInt8  {
        var val = value
        val.round()
        if val > 127.0 {
            val = 127.0
        }
        if val < -128.0 {
            val = -128.0
        }
        var signedInt: Int8 = 0
        if val.isNaN {
            signedInt = 0
        } else {
            signedInt = Int8(val)
        }
        return UInt8.init(bitPattern: Int8(signedInt))
    }

我的数据转换正确吗?

上面的代码,当我玩的时候,我听不到清晰的心跳声

ios swift audio filter signal-processing
1个回答
1
投票
    func applyFilterToData(decoded: Data, filterEnabled: Bool = true) -> Data {
    var lastData = Data()
    for decodedData in decoded {
        let unsignedData = UInt8(decodedData)
        let scaledInput = Double(unsignedData) / 128.0 - 1.0  // Assuming 0-255 range

        var filteredOutput: Double
        if filterEnabled {
            filteredOutput = iirFilterNew.filter(scaledInput)
        } else {
            filteredOutput = scaledInput
        }

        // Scaling output (adjust if needed)
        let scaledOutput = filteredOutput * 128.0 + 128.0
        let outputUInt8 = UInt8(clamping: Int(round(scaledOutput)))

        lastData.append(outputUInt8)
    }
    return lastData
}

// Improved conversion with clamping
func convertDoubleToUInt8(value: Double) -> UInt8 {
    return UInt8(clamping: Int(round(value)))
}
© www.soinside.com 2019 - 2024. All rights reserved.