swift выполняет вейвлет-свертку путем умножения частотной области - PullRequest
0 голосов
/ 07 апреля 2019

Этот вопрос находится где-то между DSP и обменом кодами.У меня есть следующий код, который выполняет свертку дискретизированного аудиосигнала.

В другой функции я создал вейвлеты Filter of Morlet в частотной области и проверил правильность значений с помощью функции Matlabs Filterbank.Действительные и мнимые векторы сохраняются в независимых массивах, называемых «fftFilterbankReal» и «fftFilterbankImag», где каждый элемент является массивом значений для соответствующего фильтра.

Я добился свертки во временной области с реальным дискретизированным сигналом и набором фильтров во временной области, однако это интенсивный процесс, и я прочитал, что он намного быстрее в частотной области.

Код, вставленный ниже, является моей функцией «свертываться во временной области».Чтобы добиться этого, я позаботился о том, чтобы мой реальный сигнал и длина моего ядра были одинакового размера, причем оба в частотной области, выполнив БПФ с использованием ускоряющей структуры, и снова я могу подтвердить правильные методы значениями 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
}

Я выполнил это, и он работает намного быстрее.Однако теперь я не понимаю, как интерпретировать результаты.Во временной области эта свертка дала бы мне мощность в наборе фильтров для каждой выборки во времени.В частотной области каждый элемент в «realProduct» и «imagProduct» соответствует центральной частоте фильтра, однако каждый из них содержит массив чисел.Результаты отдельного ДПФ - это частотные интервалы, так что я не могу понять, как интерпретировать эту информацию.

Я хотел бы быть в состоянии извлечь величину из реального сигнала, и я, используя вейвлеты, чтобы получить более низкую информацию конца.Я знаю, как извлечь величину из ДПФ самостоятельно, но мне нужно понять это.Я полагаю, что выполнение обратного ДПФ заставило бы каждую из отфильтрованных полос во временной области отобразить скалограмму.

...