У меня есть ряд дискретных значений.Итак, у меня нет мнимых значений для входной части.Я делаю дискретное преобразование Фурье с этими значениями и выполняю обратное дискретное преобразование Фурье, чтобы получить те же значения обратно.Идея состояла в том, чтобы проверить, работает ли vDSP из Accelerate Framework должным образом, потому что документация - кусок дерьма, и вы должны выяснить это самостоятельно.
Рассмотрите следующий код
lazy var DFTSetupForward: vDSP_DFT_Setup = {
guard let setup = vDSP_DFT_zop_CreateSetupD(
nil,
vDSP_Length(self.numSamples),
vDSP_DFT_Direction.FORWARD) else {
fatalError("can't create vDSP_DFT_Setup")
}
return setup
}()
lazy var DFTSetupInverse: vDSP_DFT_Setup = {
guard let setup = vDSP_DFT_zop_CreateSetupD(
nil,
vDSP_Length(self.numSamples),
vDSP_DFT_Direction.INVERSE) else {
fatalError("can't create vDSP_DFT_Setup")
}
return setup
}()
func discreteFourierTransform (_ valores:[Double] = []) -> ([Double], [Double]) {
let numeroDados = valores.count
let inputImag = Array<Double>(repeating:0.0, count:numeroDados)
var outputReal = Array<Double>(repeating:0.0, count:numeroDados)
var outputImag = Array<Double>(repeating:0.0, count:numeroDados)
vDSP_DFT_ExecuteD(DFTSetupForward, valores, inputImag, &outputReal, &outputImag)
return (outputReal, outputImag)
}
// faz a DISCRETE FOURIER TRANSFORM DOUBLE
// a saída corresponde aos vetores reais e imaginários
func discreteFourierTransformInverse (_ valoresReais:[Double] = [],
_ valoresImaginarios:[Double] = []) -> ([Double], [Double]) {
let numeroDados = valoresReais.count
var outputReal = Array<Double>(repeating:0.0, count:numeroDados)
var outputImag = Array<Double>(repeating:0.0, count:numeroDados)
vDSP_DFT_ExecuteD(DFTSetupInverse, valoresReais, valoresImaginarios, &outputReal, &outputImag)
return (outputReal, outputImag)
}
и позже эти вызовы
let (outputDFTreal, outputDFTImaginario ) = self.discreteFourierTransform(normalizedData)
let (sinalRealX, sinalImaginarioX ) = self.discreteFourierTransformInverse(outputDFTreal, outputDFTImaginario)
или другими словами, я беру результаты преобразования Фурье из первого let
и вставляю их в обратное преобразование Фурье.Я ожидаю, что sinalRealX
будет равно исходным данным, которые в этом случае равны normalizedData
, а также ожидаю, что signalImaginarioX
будет всеми нулями.
Но значения совершенно разные!
Что происходит?