在我的 iOS 应用程序中,使用 swift
我正在从数字健康设备 (BLE) 获取音频。以音频数据的形式,听到心跳声。
我们想从中消除背景噪音。
2. 为此,我们使用苹果的 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
}
如何将数据从浮点数组传递到 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))
}
我的数据转换正确吗?
上面的代码,当我玩的时候,我听不到清晰的心跳声
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)))
}