こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラムの間違いを教えてください。

VBAのFFTのプログラムをCで書き直しています。
C言語ではうまく動作しません。間違いを教えていただけないでしょうか?
よろしくお願いします。

(1)動くVBAのプログラム(参照 http://tsuyu.cocolog-nifty.com/blog/2007/03/publi.html
Option Explicit

Public Sub fft()
Dim g, h, i, j, k, l, m, n, o, p, q As Integer

i = 0
j = 0
k = 0
l = 0
p = 0
h = 0
g = 0
q = 0

'データ数nを指定(2の整数乗である必要あり)
n = 1024
m = Log(n) / Log(2)
'xr,xiはデータ数以上、s,cはデータ数の半分以上を指定しておく
Dim xr(1024), xi(1024), xd, s(512), c(512), a, b As Single

'データの読み込み 1列目を実数部、2列目を虚数部とする
For i = 1 To n
xr(i - 1) = Cells(i, 1)
xi(i - 1) = Cells(i, 2)
Next i
'FFTの計算
a = 0
b = 3.14159265359 * 2 / n
For i = 0 To n / 2
s(i) = Sin(a)
c(i) = Cos(a)
a = a + b
Next i
l = n
h = 1
For g = 1 To m
l = l / 2
k = 0
For q = 1 To h
p = 0
For i = k To l + k - 1
j = i + l
a = xr(i) - xr(j)
b = xi(i) - xi(j)
xr(i) = xr(i) + xr(j)
xi(i) = xi(i) + xi(j)
If p = 0 Then
xr(j) = a: xi(j) = b
Else
xr(j) = a * c(p) + b * s(p)
xi(j) = b * c(p) - a * s(p)
End If
p = p + h
Next i
k = k + l + l
Next q
h = h + h
Next g
j = n / 2
For i = 1 To n - 1
k = n
If j < i Then
xd = xr(i)
xr(i) = xr(j)
xr(j) = xd
xd = xi(i)
xi(i) = xi(j)
xi(j) = xd
End If
k = k / 2
Do While j >= k
j = j - k
k = k / 2
Loop
j = j + k
Next i
'データの出力
For i = 1 To n '4列目に実数部、5列目に虚数部、6列目に絶対値を表示
Cells(i, 4) = xr(i - 1)
Cells(i, 5) = xi(i - 1)
Cells(i, 6) = (xr(i - 1) ^ 2 + xi(i - 1) ^ 2) ^ 0.5
Next i
End Sub

(2)上記のプログラムの書き換えている箇所
For i = 1 To n
xr(i - 1) = Cells(i, 1)
xi(i - 1) = Cells(i, 2)
Next i
'FFTの計算
a = 0
b = 3.14159265359 * 2 / n
For i = 0 To n / 2
s(i) = Sin(a)
c(i) = Cos(a)
a = a + b
Next i
l = n
h = 1
For g = 1 To m
l = l / 2
k = 0
For q = 1 To h
p = 0
For i = k To l + k - 1
j = i + l
a = xr(i) - xr(j)
b = xi(i) - xi(j)
xr(i) = xr(i) + xr(j)
xi(i) = xi(i) + xi(j)
If p = 0 Then
xr(j) = a: xi(j) = b
Else
xr(j) = a * c(p) + b * s(p)
xi(j) = b * c(p) - a * s(p)
End If
p = p + h
Next i
k = k + l + l
Next q
h = h + h
Next g
j = n / 2
For i = 1 To n - 1
k = n
If j < i Then
xd = xr(i)
xr(i) = xr(j)
xr(j) = xd
xd = xi(i)
xi(i) = xi(j)
xi(j) = xd
End If
k = k / 2
Do While j >= k
j = j - k
k = k / 2
Loop
j = j + k
Next i

(3)書き換えたけど変な値が発生するプログラム

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

FILE *fp;
FILE *fa;
char a[100];
double b[1200];
double c[1200];
double d[1200];
double e[1200];
double f[1200];
char str[100];
char *p;
double h;
long i;
long j;
long k;
long l;
int m;
long n;
long o;
int q;
double x[25];
long s;
double t;
double u[1200];
double v[20][1200];
double v2[20][1200];
double v3[20][1200];
double w[25];
double intercept[10];
double slope[10];
double frequency[12];
double dtime;
double dtime2;
double theta1;
double theta2;
double co[1200];
double si[1200];
double xd;
long l2;
long l3;
long n3;
long h3;
long g3;
long m3;
long k3;
long p3;
long q3;
long i3;
long j3;
long x3;
double y3;
double a3;
double b3;
double c3;
double d3;
double f3;
double w2[25];
x3=0;
y3=0;
i3=0;
j3=0;
k3=0;
l3=0;
p3=0;
h3=0;
g3=0;
q3=0;
a3=0;
b3=0;
c3=0;
d3=0;



theta1=0;
theta2=3.14159265359*2/1024;
for(l=0; l<=512; l++){
si[l]=sin(theta1);
co[l]=cos(theta1);
theta1=theta1+theta2;
}

n3=1024;
m3=10;
l3=n3;
h3=1;
for(g3=1; g3<=m3; g3++){
l3=l3/2;
k3=0;
for(q3=1; q3<=h3; q3++){
p3=0;
for(i3=k3; i3<(l3+k3); i3++){
j3=i3+1;
theta1=c[i3]-c[j3];
theta2=d[i3]-d[j3];
if(p3==0){
c[j3]=theta1;
d[j3]=theta2;
}
else{
c[j3]=theta1*co[p3]+theta2*si[p3];
d[j3]=theta2*co[p3]-theta1*si[p3];
}
p3=p3+h3;
}
k3=k3+l3+l3;
}
h3=h3+h3;
}
j3=n3/2;
for(i3=1; i3<n; i3++){
k3=n3;
if(j3<i3){
xd=c[i3];
c[i3]=c[j3];
c[j3]=xd;
xd=d[i3];
d[i3]=d[j3];
d[j3]=xd;
}
k3=k3/2;
while(j3>=k3){
j3=j3-k3;
k3=k3/2;
}
j3=j3+k3;
}
for(i3=0; i3<n3; i3++){
c[i3]=c[i3]/1024;
d[i3]=d[i3]/1024;
}

(1)中の(2)箇所を(3)のように書き換えました。
どうしてもうまく動作しません。
教えていただけないでしょうか?
よろしくお願いいたします。

投稿日時 - 2011-05-10 14:10:32

QNo.6727538

すぐに回答ほしいです

質問者が選んだベストアンサー

> theta1=c[i3]-c[j3];
> theta2=d[i3]-d[j3];

いきなりc[]やd[]を使っているけど、いつ値を設定した?

投稿日時 - 2011-05-10 20:55:21

お礼

見ていただきありがとうございます。
次から気をつけます。

どうにか今回は解決できました。

投稿日時 - 2011-05-10 22:22:15

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

適切なコメント(注釈)が入ってなくて、各変数や処理の意味が全くわからない状況ですので、
何とも回答できかねるところであります。

投稿日時 - 2011-05-10 21:56:36

お礼

見ていただきありがとうございます。
次から気をつけます。

投稿日時 - 2011-05-10 22:17:44

あなたにオススメの質問