Removed coercion of `inout` to temporary pointer
This commit is contained in:
parent
868274ce26
commit
ff1e0b6e08
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue