質問編集履歴
3
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,8 +4,8 @@
|
|
4
4
|
|
5
5
|
### 前提
|
6
6
|
|
7
|
-
FFT
|
7
|
+
指数関数の符号が逆であるため、FFTの複素共役を取ると逆フーリエ変換を得られる事が分かります。
|
8
|
-
ただ、対称的にIFFTを実装する方法が分からないのでご教授頂ければと思います。
|
8
|
+
ただ、FFTと対称的にIFFTを実装する(再帰関数のみで実装する)方法が分からないのでご教授頂ければと思います。
|
9
9
|
|
10
10
|
### 該当のソースコード
|
11
11
|
|
2
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -54,8 +54,13 @@
|
|
54
54
|
|
55
55
|
### 試したこと
|
56
56
|
|
57
|
-
IFFTは以下のように実装してみましたが期待した結果が得られませんでした
|
57
|
+
IFFTは以下のように実装してみましたが、期待した結果が得られませんでした
|
58
58
|
```C
|
59
|
+
#include <stdio.h>
|
60
|
+
#include <stdlib.h>
|
61
|
+
#include <math.h>
|
62
|
+
#include <complex.h>
|
63
|
+
|
59
64
|
void ifft(double complex* x, int n) {
|
60
65
|
|
61
66
|
if (n == 1) {
|
1
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -52,6 +52,45 @@
|
|
52
52
|
|
53
53
|
```
|
54
54
|
|
55
|
+
### 試したこと
|
56
|
+
|
57
|
+
IFFTは以下のように実装してみましたが期待した結果が得られませんでした
|
58
|
+
```C
|
59
|
+
void ifft(double complex* x, int n) {
|
60
|
+
|
61
|
+
if (n == 1) {
|
62
|
+
|
63
|
+
return;
|
64
|
+
}
|
65
|
+
|
66
|
+
double complex* xe = malloc(n / 2 * sizeof(double complex));
|
67
|
+
double complex* xo = malloc(n / 2 * sizeof(double complex));
|
68
|
+
|
69
|
+
for (int i = 0; i < n / 2; i++) {
|
70
|
+
|
71
|
+
double complex w = cexp(-2 * M_PI * I * i / n);
|
72
|
+
|
73
|
+
xe[i] = x[i] + x[i + n / 2];
|
74
|
+
xo[i] = (x[i] - x[i + n / 2]) * w;
|
75
|
+
}
|
76
|
+
|
77
|
+
fft(xe, n / 2);
|
78
|
+
fft(xo, n / 2);
|
79
|
+
|
80
|
+
for (int i = 0; i < n / 2; i++) {
|
81
|
+
|
82
|
+
x[i] = xe[i];
|
83
|
+
x[i + n / 2] = xo[i];
|
84
|
+
}
|
85
|
+
|
86
|
+
free(xe);
|
87
|
+
free(xo);
|
88
|
+
|
89
|
+
return;
|
90
|
+
}
|
91
|
+
|
92
|
+
```
|
93
|
+
|
55
94
|
### 補足情報(FW/ツールのバージョンなど)
|
56
95
|
|
57
96
|
Debian 11.5
|