Я работаю над конвейером разработки функций для CoreML, и мне нужно выполнить БПФ для моих данных. Проблема заключается в том, что результаты инфраструктуры ускорения и результаты БПФ NumPy различны.
Swift:
public func fft(_ input: [Double]) -> [Double] {
var real = [Double](input)
var imaginary = [Double](repeating: 0.0, count: input.count)
var splitComplex = DSPDoubleSplitComplex(realp: &real, imagp: &imaginary)
let length = vDSP_Length(floor(log2(Float(input.count))))
let radix = FFTRadix(kFFTRadix2)
let weights = vDSP_create_fftsetupD(length, radix)
vDSP_fft_zipD(weights!, &splitComplex, 1, length, FFTDirection(FFT_FORWARD))
var magnitudes = [Double](repeating: 0.0, count: input.count)
vDSP_zvmagsD(&splitComplex, 1, &magnitudes, 1, vDSP_Length(input.count))
var normalizedMagnitudes = [Double](repeating: 0.0, count: input.count)
vDSP_vsmulD(sqrt(magnitudes), 1, [2.0 / Double(input.count)], &normalizedMagnitudes, 1, vDSP_Length(input.count))
vDSP_destroy_fftsetupD(weights)
return normalizedMagnitudes
}
Python:
def fft(series: pd.Series):
f = np.fft.fft(series)
fa = np.abs(f)
return pd.Series(fa)
Я использую одинаковые 100 значений для каждого метода.
Полагаю, это как-то связано с нормализующей частью, но я даже не уверен, что оба массива содержат одно и то же:
- индекс 0: нулевой частотный член
- индекс 1-50: положительные величины
- индекс 50-99: отрицательные величины
Меня интересуют только положительные величины.
Редактировать:
Вот график NumPy:
А вот и Ускоренный сюжет:
Я надеюсь, что кто-то может помочь:)