質問編集履歴

4

プログラムの修正

2021/02/22 09:55

投稿

Anfaenger
Anfaenger

スコア14

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  周波数は25000Hzくらいまで表示できるのですが
12
12
 
13
- パワースペクトルが一致しません。
13
+ パワースペクトルが周波数と対応しません。
14
14
 
15
15
  どなたかご教示お願い致します。
16
16
 
@@ -52,7 +52,17 @@
52
52
 
53
53
  double dt = 0.01;
54
54
 
55
+ double sc;
56
+
55
- double sc, x[N], y[N];
57
+ double* x, * y;
58
+
59
+ x = (double*)malloc(sizeof(double) * N);
60
+
61
+ y = (double*)malloc(sizeof(double) * N);
62
+
63
+
64
+
65
+
56
66
 
57
67
  double fq, pw;
58
68
 
@@ -84,7 +94,11 @@
84
94
 
85
95
  for (i = 0; i < N; i++) {
86
96
 
97
+ if (i % 256 == 0) {
98
+
87
- pw = sqrt(x[i] * x[i] + y[i] * y[i]) * 100; // パワースペクトル
99
+ pw = sqrt(x[i] * x[i] + y[i] * y[i]) * 100; // パワースペクトル
100
+
101
+ }
88
102
 
89
103
  fq = i / (dt * Fr); // 周波数
90
104
 
@@ -114,7 +128,9 @@
114
128
 
115
129
  void S_fft(double ak[], double bk[], int n, int ff) {
116
130
 
117
- int i, j, k, k1, num, nhalf, phi, phi0, rot[N];
131
+ int i, j, k, k1, num, nhalf, phi, phi0;
132
+
133
+ static int rot[N];
118
134
 
119
135
  double s, sc, c, a0, b0, tmp;
120
136
 
@@ -178,8 +194,6 @@
178
194
 
179
195
  }
180
196
 
181
-
182
-
183
197
  ```
184
198
 
185
199
 
@@ -188,7 +202,15 @@
188
202
 
189
203
 
190
204
 
191
- 配列の要素数変えてみました。
205
+ malloc使ってみましたが、下記の警告が出て異常終了してしまいます
206
+
207
+
208
+
209
+ ### 警告
210
+
211
+ NULLポインター'x'を逆参照しています。
212
+
213
+ NULLポインター'y'を逆参照しています。
192
214
 
193
215
 
194
216
 

3

誤字修正

2021/02/22 09:55

投稿

Anfaenger
Anfaenger

スコア14

test CHANGED
File without changes
test CHANGED
@@ -62,7 +62,7 @@
62
62
 
63
63
  for (i = 0; i < N; i++) { // 1Hzに60Hzのノイズが重なった波形の例
64
64
 
65
- x[i] = sin(sc * 30 * i);
65
+ x[i] = sin(sc * i);
66
66
 
67
67
  y[i] = 0.0;
68
68
 

2

誤字

2021/02/22 09:39

投稿

Anfaenger
Anfaenger

スコア14

test CHANGED
File without changes
test CHANGED
@@ -8,11 +8,9 @@
8
8
 
9
9
  http://www-in.aut.ac.jp/~minemura/pub/Csimu/C/FFT.html
10
10
 
11
- しかしNを1025以上にするとコード-1073741819で終了してしまいます
11
+ 周波数は25000Hzくらいまで表示できるので
12
12
 
13
- 20000Hzくらいまで表示できるようにしたいのですが、約100Hzまでしか表示できなくて困っています。
14
-
15
- 原因全く分かりません……
13
+ パワースペクトル一致しません
16
14
 
17
15
  どなたかご教示お願い致します。
18
16
 
@@ -190,7 +188,7 @@
190
188
 
191
189
 
192
190
 
193
- 配列の要素数も増やしてみましたがやはり同じ結果になってしまいます
191
+ 配列の要素数を変えてみました。
194
192
 
195
193
 
196
194
 

1

このプログラムで周波数は25000Hzくらいまで表示できるのですが、右側のパワースペクトルが一致しません。ご教示お願いします。

2021/02/21 15:25

投稿

Anfaenger
Anfaenger

スコア14

test CHANGED
File without changes
test CHANGED
@@ -44,17 +44,19 @@
44
44
 
45
45
  void S_fft(double* x, double* y, int, int);
46
46
 
47
+ #define N 32768 // N=データ総数(2,4,8,16,32,64,128,256,512,1024 のどれか)
48
+
47
49
 
48
50
 
49
51
  int main(void) {
50
52
 
51
- int i, N = 1024; // N=データ総数(2,4,8,16,32,64,128,256,512,1024 のどれか)
53
+ int i, count, Fr = 128;
52
54
 
53
55
  double dt = 0.01;
54
56
 
55
- double sc, fq, x[1024], y[1024];
57
+ double sc, x[N], y[N];
56
-
58
+
57
- int pw;
59
+ double fq, pw;
58
60
 
59
61
 
60
62
 
@@ -62,21 +64,19 @@
62
64
 
63
65
  for (i = 0; i < N; i++) { // 1Hzに60Hzのノイズが重なった波形の例
64
66
 
65
- x[i] = sin(sc * i) + 0.1 * sin(sc * 60.0 * i) + 0.5 * sin(sc * 30.0 * i);
67
+ x[i] = sin(sc * 30 * i);
66
68
 
67
69
  y[i] = 0.0;
68
70
 
69
71
  }
70
72
 
71
-
72
-
73
73
  // Fourier変換
74
74
 
75
75
  S_fft(x, y, N, -1);
76
76
 
77
77
 
78
78
 
79
- for (i = 0; i < N; i++) printf(" i=%d %f %f \n", i, x[i], y[i]);
79
+ //for (i = 0; i < Fr; i++) printf(" i=%d %f %f \n", i, x[i], y[i]);
80
80
 
81
81
 
82
82
 
@@ -88,11 +88,11 @@
88
88
 
89
89
  pw = sqrt(x[i] * x[i] + y[i] * y[i]) * 100; // パワースペクトル
90
90
 
91
- fq = i / (dt * N); // 周波数
91
+ fq = i / (dt * Fr); // 周波数
92
92
 
93
93
  //printf("%f = %d / (%f * %d)\n", fq, i, dt, N);
94
94
 
95
- fprintf(fp, "%fHz %d \n", fq, pw);
95
+ fprintf(fp, "%fHz %f \n", fq, pw);
96
96
 
97
97
  }
98
98
 
@@ -116,7 +116,7 @@
116
116
 
117
117
  void S_fft(double ak[], double bk[], int n, int ff) {
118
118
 
119
- int i, j, k, k1, num, nhalf, phi, phi0, rot[1024];
119
+ int i, j, k, k1, num, nhalf, phi, phi0, rot[N];
120
120
 
121
121
  double s, sc, c, a0, b0, tmp;
122
122