在Swift中计算FFT的问题

时间:2015-08-10 23:19:07

标签: ios swift fft

我正在尝试使用此算法为我提供快速傅立叶变换。当我复制它时,我的编译器在vDSP_vsmul()函数内的sqrt()函数上窒息。 enter link description here

的第41行

错误说找不到接受类型'([(Float)])'的参数列表的sqrt的重载。任何人都知道这部分功能正在尝试做什么?代码似乎试图采用浮点数组的平方根,这似乎很奇怪,我只能假设它曾经能够在ios 8.4之前编译,因为Surge库是非常重要的星号。该函数如下所示:

import Accelerate

// MARK: Fast Fourier Transform

public func fft(input: [Float]) -> [Float] {
var real = [Float](input)
var imaginary = [Float](count: input.count, repeatedValue: 0.0)
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)
vDSP_fft_zip(weights, &splitComplex, 1, length, FFTDirection(FFT_FORWARD))

var magnitudes = [Float](count: input.count, repeatedValue: 0.0)
vDSP_zvmags(&splitComplex, 1, &magnitudes, 1, vDSP_Length(input.count))

var normalizedMagnitudes = [Float](count: input.count, repeatedValue: 0.0)
vDSP_vsmul(sqrt(magnitudes), 1, [2.0 / Float(input.count)], &normalizedMagnitudes, 1, vDSP_Length(input.count))

vDSP_destroy_fftsetup(weights)

return normalizedMagnitudes
}

2 个答案:

答案 0 :(得分:4)

Magnitudes是一个数组[Float],但sqrt只接受单Float。如果需要在整个阵列上运行sqrt,则需要使用map或其中一种Accelerate方法。

更新:看起来原始帖子中的示例代码来自自定义框架,其中包含its own sqrt([Float]) -> [Float]

答案 1 :(得分:0)

幅度是浮动数组。 例如[1.6,3.6]

在swift中 - > sqrt(Double)接受参数类型Double not Array。 例如sqrt(25.0)

问题是你将Array传递给sqrt。 sqrt([25.0,36.0])