我正在尝试使用这个算法来进行快速傅里叶变换。当我复制 vDSP_vsmul() 函数内的 sqrt() 函数时,我的编译器卡住了。 enter link description here 第 41 行
错误指出无法找到接受“([(Float)])”类型参数列表的 sqrt 重载。有人知道这部分功能想要做什么吗?该代码似乎试图取 float 组的平方根,这看起来很奇怪,我只能假设它曾经能够在 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
}
最佳答案
Magnitudes
是一个数组 [Float]
,但 sqrt
仅接受单个 Float
。如果需要对整个数组运行 sqrt,则需要使用 map 或 Accelerate 方法之一。
更新:看起来原始帖子中的示例代码来自自定义框架,其中有 its own sqrt([Float]) -> [Float] 。
关于ios - 在 Swift 中计算 FFT 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31930712/