ios - 在 Swift 中计算 FFT 时出现问题

标签 ios swift fft

我正在尝试使用这个算法来进行快速傅里叶变换。当我复制 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/

相关文章:

ios - React Native 0.63.2 iOS 构建错误与 `ld: library not found for -lAppAuth`

ios - 将数据一束一束地加载到 UICollectionView 中

ios - 同时处理两个手势识别器

c++ - 在应用 FFT 之前从 wav 文件中读取数据

python - 带数组的傅里叶变换

ios - 如何在 iOS 上获取路由表详细信息

ios - Firebase 更新数组值或创建新数组值

swift - 尽管我正确保存了文件并看到了它,但为什么我无法获取文件路径?

math - 正弦波频率拟合

ios - 我应该为 ios 客户端启用 cors 吗?