Ios FFT计算错误-Swift

Ios FFT计算错误-Swift,ios,swift,fft,Ios,Swift,Fft,我想用快速傅立叶变换。我的计算是根据实际情况来计算的。我很难得到正确的结果。当我对一个1000赫兹的声音进行fft时,我得到的结果是这样的。当我用同样的语气使用python时,我得到的东西看起来更加正确。python代码如下所示: import numpy as np import scipy.io.wavfile import numpy.fft import matplotlib.pyplot as plt FILENAME = 'beep.wav' fs, data = scipy.i

我想用快速傅立叶变换。我的计算是根据实际情况来计算的。我很难得到正确的结果。当我对一个1000赫兹的声音进行fft时,我得到的结果是这样的。当我用同样的语气使用python时,我得到的东西看起来更加正确。python代码如下所示:

import numpy as np
import scipy.io.wavfile
import numpy.fft
import matplotlib.pyplot as plt

FILENAME = 'beep.wav'

fs, data = scipy.io.wavfile.read(FILENAME)
data = data[:801]
spacing = 1 / float(fs)
freq = numpy.fft.rfft(data)
freq_power = np.abs(freq)
a = 1 / (2 * spacing)
b = (len(data) + 1) // 2
freq_axis = np.linspace(0, a, b)
plt.plot(freq_axis, freq_power)
plt.show()
swift代码看起来像

import Accelerate
public func sqrt(x: [Float]) -> [Float] {
var results = [Float](count: x.count, repeatedValue: 0.0)
vvsqrtf(&results, x, [Int32(x.count)])

return results
}

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)
println(weights)
vDSP_fft_zip(weights, &splitComplex, 1, 8, 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
}

重申。swift代码是给出意外结果的代码。我做错了什么?

看起来您在加速框架中使用的是Swift浮点数组,但是您可能需要使用
UnsafemeutablePointer
类型来分配向量,因为加速框架是一个Objective C框架。下面是一个如何做到这一点的示例

public func sqrt(x: [Float]) -> [Float] {
    // convert swift array to C vector
    var temp = UnsafeMutablePointer<Float>.alloc(x.count)
    for (var i=0;i<x.count;i++) {
        temp[i] = x[i];
    }
    var count = UnsafeMutablePointer<Int32>.alloc(1)
    count[0] = Int32(x.count)
    vvsqrtf(temp, temp, count)
    // convert C vector to swift array
    var results = [Float](count: x.count, repeatedValue: 0.0)
    for (var i=0;i<x.count;i++) {
        results[i] = temp[i];
    }
    // Free memory
    count.dealloc(1)
    temp.dealloc(x.count)
    return results
}
public func sqrt(x:[Float])->[Float]{
//将swift数组转换为C向量
var temp=UnsafeMutablePointer.alloc(x.count)

对于(var i=0;iYou不显示Swift读取的wave文件的等效值。您验证过(通过打印输出等)了吗Swift fft的输入数据和长度是否与从Python wave文件读取中获得的数据相似?如何解决此问题?我还使用Swift浪涌库执行fft,得到的结果与仅使用MATLAB时不同。按照惯例,Swift在for循环后不使用括号