Я выполняю обратный фрейм-2 diff. Я использую свойства сопряжения и масштабирования, чтобы вернуть результат. Я сопрягаю свой входной вектор, выполняю регулярный radix-2 fft (не ifft), сопрягаю результаты, затем масштабируюсь на 1.0/N. Тем не менее, я не получаю правильные результаты:inverse fft, производящий закрытый, но неправильный вывод
int main(){
const int n = 4;
complex<double> x[n];
// Test signal
x[0] = complex<double>(10,0);
x[1] = complex<double>(-2,0);
x[2] = complex<double>(-2,2);
x[3] = complex<double>(-2,-2);
print(x,n);
fft_inverse(x,n);
print(x,n);
}
//dif fft. works
void fft(complex<double> X[], int N){
if(N == 1){return;}
complex<double> *temp = new complex<double>[N];
for(int i=0; i<N; i++){
temp[i]=X[i];
}
for(int i = 0; i<N/2; i++){
complex<double> tw(cos(-2*M_PI*i/N),sin(-2*M_PI*i/N));
X[i] = temp[i] + temp[i+N/2];
X[i+N/2] = temp[i]-temp[i+N/2];
X[i+N/2] = X[i+N/2]*tw;
}
fft(X,N/2);
fft(X+N/2,N/2);
}
void fft_inverse(complex<double> X[], int N){
//conjugate
for(int i = 0; i<N;i++){
X[i] = conj(X[i]);
}
//perform fft
fft(X,N);
//conjugate again
for(int i = 0; i<N;i++){
X[i] = conj(X[i]);
}
//scale by 1.0/N
double norm_N = 1.0/N;
for(int i = 0; i<N;i++){
X[i] *= norm_N;
}
}
Вот мои результаты: ввода:
(10,0) (-2,0) (-2,2) (-2, -2)
Выход:
(1, -0) (3,1) (2,5, -0,5) (3,5, -0,5)
Вывод должен быть:
(1,0) (2,0) (3,0) (4,0)
Что происходит? Я проверил свой fft
на том, что должно быть на выходе, и получил правильный результат, поэтому я не уверен, в чем проблема.
Я согласен, что 'fft', вероятно, является преступником. Если сигнал во временной области действительно был «1, 2, 3, 4», который является реальным, тогда БПФ должен был быть симметричным. Что это не так. –
Я склонен согласиться, однако, я протестировал 'fft' на входе' (1,0), (2,0), (3,0), (4,0) 'и получил правильный результат .. – DashControl
Попробуйте другой и/или более поздний FFT - сравните результаты с известным хорошим FFT, например MATLAB/Octave/Wolfram Alpha. –