質問編集履歴

3

修正

2023/03/22 06:39

投稿

iFQ7Vj
iFQ7Vj

スコア52

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

修正

2023/03/22 06:14

投稿

iFQ7Vj
iFQ7Vj

スコア52

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

追記

2023/03/22 06:13

投稿

iFQ7Vj
iFQ7Vj

スコア52

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