我正在尝试使用此算法为我提供快速傅立叶变换。当我复制它时,我的编译器在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
}
答案 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])