通过倍频域快速执行小波卷积

时间:2019-04-07 15:41:49

标签: swift fft frequency convolution wavelet

这个问题落在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将使我在时域中的每个滤波带显示比例尺。

0 个答案:

没有答案