Removed coercion of `inout` to temporary pointer

This commit is contained in:
Vincent Esche 2020-05-12 15:15:59 +02:00 committed by Vincent Esche
parent 868274ce26
commit ff1e0b6e08
1 changed files with 56 additions and 40 deletions

View File

@ -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
}