这个问题落在DSP和代码交换之间。我有以下代码对采样的音频信号进行卷积。
在另一个函数中,我在频域中创建了Morlet小波滤波器组,并使用Matlabs滤波器组功能验证了值正确。实矢量和虚矢量都保存在称为'fftFilterbankReal'和'fftFilterbankImag'的独立数组中,每个元素都是对应滤波器的值数组。
我已经在时域使用实际采样信号实现了卷积,并且在时域实现了滤波器组,但是这是过程密集型的,并且已经阅读到它在频域上要快得多。下面粘贴的代码是我“在时域中卷积”的功能。为了实现这一点,我通过使用加速框架执行FFT,确保了我的真实信号和我的内核长度都相同,并且在频域中都相同,并且我可以再次使用Matlabs值确认正确的方法。然后,我将真实信号和内核相乘,得出两者的乘积。并将其保存在“ realProduct”和“ imagProduct”中,以备后用。我对每个内核重复此操作(“ fftFilterbankReal”和“ fftFilterbankImag”中的每个元素)。
func convolveSignal(realSamples:[Float], imagSamples:[Float]) {
var realIn = realSamples
var imagIn = imagSamples
let N = x.count
let logN = 12
let fft1Setup = vDSP_create_fftsetup(UInt(logN), FFTRadix(FFT_RADIX2))!
var complexInput = DSPSplitComplex(realp:UnsafeMutablePointer(mutating: realIn), imagp:UnsafeMutablePointer(mutating: imagIn))
var realOut = [Float](repeating:[], count N)
var imagOut = [Float](repeating:[], count:N)
var complexOutput = DSPSplitComplex(realp:UnsafeMutablePointer(mutating: realOut), imagp:UnsafeMutablePointer(mutating: imagOut))
vDSP_fft_zop(fft1Setup, &(complexInput), 1, &complexOutput, 1, UInt(logN), Int32(FFT_FORWARD))
realOut.remove(at:0)
imagOut.remove(at:0)
for i in 0..<self.fftfilterbankReal.count {
var realKernel:[Float] = self.fftfilterbankReal[i]
var imagKernel:[Float] = self.fftfilterbankImag[i]
var kernel:DSPSplitComplex? = DSPSplitComplex(realp: &realKernel, imagp: &imagKernel)
var realResult = [Float](repeating: 0, count: realKernel.count)
var imagResult = [Float](repeating: 0, count: imagKernel.count)
var complexResult = DSPSplitComplex(realp:UnsafeMutablePointer(mutating: realResult), imagp:UnsafeMutablePointer(mutating: imagResult))
vDSP_zvmul(&kernel, 1, &complexInput, 1, &complexResult, 1, vDSP_Length(realKernel.count), 1)
self.realProduct[i] = realResult
self.imagProduct[i] = imagResult
}
我已经完成了它,并且运行速度更快。但是我现在很困惑如何解释结果。在时域中,这种卷积将为我提供每个时间样本在Filterbank中的能量。在频域中,“ realProduct”和“ imagProduct”中的每个元素对应于滤波器的中心频率,但是每个元素都包含一个数字数组。单个DFT的结果是频率段,因此这使我对如何解释此信息感到困惑。
我希望能够从真实信号中提取幅度,而且,我希望使用小波来提取更多的低端信息。我知道如何独自从DFT中提取幅度,但需要对此有所了解。我相信执行逆DFT将使我在时域中的每个滤波带显示比例尺。