From ff1e0b6e08209ef63176edfa27d4f675e6f49987 Mon Sep 17 00:00:00 2001 From: Vincent Esche Date: Tue, 12 May 2020 15:15:59 +0200 Subject: [PATCH] Removed coercion of `inout` to temporary pointer --- .../Surge/Digital Signal Processing/FFT.swift | 96 +++++++++++-------- 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/Sources/Surge/Digital Signal Processing/FFT.swift b/Sources/Surge/Digital Signal Processing/FFT.swift index 7f75ce8..43ea0c3 100644 --- a/Sources/Surge/Digital Signal Processing/FFT.swift +++ b/Sources/Surge/Digital Signal Processing/FFT.swift @@ -25,57 +25,73 @@ import Accelerate public func fft(_ input: [Float]) -> [Float] { var real = [Float](input) var imaginary = [Float](repeating: 0.0, count: input.count) - var splitComplex = DSPSplitComplex(realp: &real, imagp: &imaginary) - let length = vDSP_Length(floor(log2(Float(input.count)))) - let radix = FFTRadix(kFFTRadix2) - let weights = vDSP_create_fftsetup(length, radix) - withUnsafeMutablePointer(to: &splitComplex) { splitComplex in - vDSP_fft_zip(weights!, splitComplex, 1, length, FFTDirection(FFT_FORWARD)) - } + return real.withUnsafeMutableBufferPointer { realBuffer in + imaginary.withUnsafeMutableBufferPointer { imaginaryBuffer in + var splitComplex = DSPSplitComplex( + realp: realBuffer.baseAddress!, + imagp: imaginaryBuffer.baseAddress! + ) - var magnitudes = [Float](repeating: 0.0, count: input.count) - withUnsafePointer(to: &splitComplex) { splitComplex in - magnitudes.withUnsafeMutableBufferPointer { magnitudes in - vDSP_zvmags(splitComplex, 1, magnitudes.baseAddress!, 1, vDSP_Length(input.count)) + let length = vDSP_Length(floor(log2(Float(input.count)))) + let radix = FFTRadix(kFFTRadix2) + let weights = vDSP_create_fftsetup(length, radix) + withUnsafeMutablePointer(to: &splitComplex) { splitComplex in + vDSP_fft_zip(weights!, splitComplex, 1, length, FFTDirection(FFT_FORWARD)) + } + + var magnitudes = [Float](repeating: 0.0, count: input.count) + withUnsafePointer(to: &splitComplex) { splitComplex in + magnitudes.withUnsafeMutableBufferPointer { magnitudes in + vDSP_zvmags(splitComplex, 1, magnitudes.baseAddress!, 1, vDSP_Length(input.count)) + } + } + + var normalizedMagnitudes = [Float](repeating: 0.0, count: input.count) + normalizedMagnitudes.withUnsafeMutableBufferPointer { normalizedMagnitudes in + vDSP_vsmul(sqrt(magnitudes), 1, [2.0 / Float(input.count)], normalizedMagnitudes.baseAddress!, 1, vDSP_Length(input.count)) + } + + vDSP_destroy_fftsetup(weights) + + return normalizedMagnitudes } } - - var normalizedMagnitudes = [Float](repeating: 0.0, count: input.count) - normalizedMagnitudes.withUnsafeMutableBufferPointer { normalizedMagnitudes in - vDSP_vsmul(sqrt(magnitudes), 1, [2.0 / Float(input.count)], normalizedMagnitudes.baseAddress!, 1, vDSP_Length(input.count)) - } - - vDSP_destroy_fftsetup(weights) - - return normalizedMagnitudes } public func fft(_ input: [Double]) -> [Double] { var real = [Double](input) var imaginary = [Double](repeating: 0.0, count: input.count) - var splitComplex = DSPDoubleSplitComplex(realp: &real, imagp: &imaginary) - let length = vDSP_Length(floor(log2(Float(input.count)))) - let radix = FFTRadix(kFFTRadix2) - let weights = vDSP_create_fftsetupD(length, radix) - withUnsafeMutablePointer(to: &splitComplex) { splitComplex in - vDSP_fft_zipD(weights!, splitComplex, 1, length, FFTDirection(FFT_FORWARD)) - } + return real.withUnsafeMutableBufferPointer { realBuffer in + imaginary.withUnsafeMutableBufferPointer { imaginaryBuffer in + var splitComplex = DSPDoubleSplitComplex( + realp: realBuffer.baseAddress!, + imagp: imaginaryBuffer.baseAddress! + ) - var magnitudes = [Double](repeating: 0.0, count: input.count) - withUnsafePointer(to: &splitComplex) { splitComplex in - magnitudes.withUnsafeMutableBufferPointer { magnitudes in - vDSP_zvmagsD(splitComplex, 1, magnitudes.baseAddress!, 1, vDSP_Length(input.count)) + let length = vDSP_Length(floor(log2(Float(input.count)))) + let radix = FFTRadix(kFFTRadix2) + let weights = vDSP_create_fftsetupD(length, radix) + withUnsafeMutablePointer(to: &splitComplex) { splitComplex in + vDSP_fft_zipD(weights!, splitComplex, 1, length, FFTDirection(FFT_FORWARD)) + } + + var magnitudes = [Double](repeating: 0.0, count: input.count) + withUnsafePointer(to: &splitComplex) { splitComplex in + magnitudes.withUnsafeMutableBufferPointer { magnitudes in + vDSP_zvmagsD(splitComplex, 1, magnitudes.baseAddress!, 1, vDSP_Length(input.count)) + } + } + + var normalizedMagnitudes = [Double](repeating: 0.0, count: input.count) + normalizedMagnitudes.withUnsafeMutableBufferPointer { normalizedMagnitudes in + vDSP_vsmulD(sqrt(magnitudes), 1, [2.0 / Double(input.count)], normalizedMagnitudes.baseAddress!, 1, vDSP_Length(input.count)) + } + + vDSP_destroy_fftsetupD(weights) + + return normalizedMagnitudes } } - - var normalizedMagnitudes = [Double](repeating: 0.0, count: input.count) - normalizedMagnitudes.withUnsafeMutableBufferPointer { normalizedMagnitudes in - vDSP_vsmulD(sqrt(magnitudes), 1, [2.0 / Double(input.count)], normalizedMagnitudes.baseAddress!, 1, vDSP_Length(input.count)) - } - - vDSP_destroy_fftsetupD(weights) - - return normalizedMagnitudes }