对心跳声应用低通、高通DSP滤波器,无法消除额外的噪音

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

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

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

  1. 我们对接收到的数据应用 ADPCM 解码器。播放时有背景噪音和心跳声。

  2. 我们应用过滤器来消除背景噪音。使用苹果的DSP代码,应用低通滤波器和高通滤波器。

苹果的DSP滤波器链接

示例项目,添加要播放的音频文件

音频文件在苹果的DSP滤波器代码中播放良好。 在Apple的DSP应用中,他们使用的是AVAudioEngine。

在我的演示代码中,我需要音频心跳进行过滤,使用了音频单元和 TPCircularBuffer。并使用Apple的DSP高通和低通滤波器。

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

let musicProvider = FilterableMusicProvider()
var page = [Float]()

 // Code in viewDidLoad

让样本= musicProvider.loadAudioSamples(样本:audioData.map { 浮点数($0) })

               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()

               musicProvider.selectedSectionIndex = 1
               musicProvider.parameters[1].filterType = .highpass
               musicProvider.parameters[1].frequency = 44.5
               musicProvider.parameters[1].Q = 0.272
               musicProvider.parameters[1].dbGain = 0.0
               musicProvider.setSelectedSectionCoefficients()

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


    }
     
 //Method for playing byte array
   func getSignalElement() -> Float {
        var lastData = Data()
        for signal in page {
            let uInt8 = 
        iirFilterNew.convertDoubleToUInt8(Double(signal))
        lastData.append(uInt8)
    }
    
    let i16array = lastData.withUnsafeBytes {  bufferPointer in
        TPCircularBufferProduceBytes(iosAudio.addressOfTPBuffer(),                                           bufferPointer.baseAddress,
                                         
       UInt32(bufferPointer.count));
     }
    return page.isEmpty ? 0 : page.removeFirst()
}

  //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.