Получение Inverse DFT для работы с Accelerate framework
Я изо всех сил пытаюсь заставить Inverse DFT работать с платформой Apple Accelerate.
Это использует функцию vDSP_DFT_ExecuteD в Swift.
Это мой код, который вы можете попробовать на игровой площадке:
import Accelerate
var real = [36.000000, -4.000000, -4.000000, -4.000000, -4.000000, -4.000000, -4.000000, -4.000000 ]
var imag = [0.000000, 9.656854, 4.000000, 1.656854, 0.000000, -1.656854, -4.000000, -9.656854]
let weights = vDSP_DFT_zrop_CreateSetupD(nil, vDSP_Length(real.count), vDSP_DFT_Direction.INVERSE)!
var realHalf = [Double](repeating: 0.0, count: real.count/2)
var imagHalf = [Double](repeating: 0.0, count: real.count/2)
realHalf[0] = real[0]
imagHalf[0] = real[real.count/2]
for n in 1..<real.count/2 {
realHalf[n] = real[n]
imagHalf[n] = imag[n]
}
print("realHalf=\(realHalf)")
print("imagHalf=\(imagHalf)")
var OrealHalf = [Double](repeating: 0.0, count: real.count/2)
var OimagHalf = [Double](repeating: 0.0, count: real.count/2)
vDSP_DFT_ExecuteD(weights, &real, &imag, &OrealHalf, &OimagHalf)
print("OrealHalf=\(OrealHalf)")
print("OimagHalf=\(OimagHalf)")
var Oreal = [Double](repeating: 0.0, count: real.count)
let Oimag = [Double](repeating: 0.0, count: real.count)
for n in 0..<Oreal.count/2 {
Oreal[2*n ] = OrealHalf[n]
Oreal[2*n+1] = OimagHalf[n]
}
print("Oreal=\(Oreal)")
print("Oimag=\(Oimag)") // Expected to be zeros
vDSP_DFT_DestroySetupD(weights)
Выход:
realHalf=[36.0, -4.0, -4.0, -4.0]
imagHalf=[-4.0, 9.6568539999999992, 4.0, 1.656854]
OrealHalf=[12.0, 28.0, 44.0, 60.0]
OimagHalf=[12.000000705671019, 28.000000705671017, 43.99999929432898, 59.999999294328987]
Oreal=[12.0, 12.000000705671019, 28.0, 28.000000705671017, 44.0, 43.99999929432898, 60.0, 59.999999294328987]
Oimag=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
Но ожидаемый результат: [ 1,0, 2,0, 3,0, 4,0, 5,0, 6,0, 7,0, 8,0 ]
Проверено выполнением прямого FFT для получения переменных real / imag в верхней части кода. Вы также можете проверить это на http://scistatcalc.blogspot.com/2013/12/fft-calculator.html
Я знаю, что есть некоторая специальная раскладка для предоставления vDSP_DFT_ExecuteD(), как описано Apple по адресу https://developer.apple.com/documentation/accelerate/1450538-vdsp_dft_execute (в частности, потому что я иду обратным и сложным для реального), и мне удалось успешно применить этот специальный макет, чтобы заставить работать прямой DFT, но я не смог выяснить заклинание для обратного пути.