- 締切済み
離散フーリエ変換について
10 REM dft 20 N=8 30 DIM A(N),B(N),X(N) 40 FOR I=0 TO N-1 50 READ X(1) 60 NEXT I 70 P=6.283/N 80 FOR K=0 TO N-1 90 A(K)=0:B(K)=0 100 FOR J=0 TO N-1 110 A(K) =A(K)+X(j)*COS(P*J*K) 120 B(K) =B(K)-X(J)*SIN(P*J*K) 130 NEXT J 140 NEXT K 150 FOR I=0 TO N-1 160 Y=SQL(A(I)^2+B(I)^2) 170 LPRINT I;:LPRINT USING "###,###";A(I),B(I),Y 180 NEXT I 190 DATA 1,1,1,1,0,0,0,0 このDFTプログラムをC言語に直したいのですがよく分かりません; お願いします@@;
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Schwarz20
- ベストアンサー率46% (6/13)
ずいぶん懐かしい言語で書かれたソースですね この言語は、BASICですよ BASICといってもVisual Basicでは、ありません VB以前のBASICで、N88-BASICや、BASIC/98とかにあたります さて、プログラムの内容ですが、だいたい、以下の内容になっています 先頭にある数字は、行番号なので、それを手がかりに参考にしてください 10は、コメントです 20~30は、定数と、配列を宣言してます 40~60は、190にある元データを配列Xに代入しています 70~140は、フーリエ変換の本体部分です 150~190は、出力部分です(LPRINTなので、プリンタに出力しているかも) C/C++に直すと以下のようになります なお、注意点としては、 ・純粋なC言語にすると、元のソースとの対応が混乱しそうなので、C++にしています。 ・LPRINT文は、プリンタ出力を行うのですが、今回は、標準出力にしています。 ・コンパイルおよび、実行は行っていません。細かいところで誤りがあるかも知れません。 です。ご容赦ください。 /* dft */ #include <cstdio> #include <cmath> using namespace std; int main(void) { // 20~30の内容をC/C++で書くと int N = 8; // 定数なので、#defineにしたほうが良いかも double A(N), B(N), X(N); // 40~60、190の内容をC/C++で書くと X(0) = 1.0; X(1) = 1.0; X(2) = 1.0; X(3) = 1.0; X(4) = 0.0; X(5) = 0.0; X(6) = 0.0; X(7) = 0.0; // 70~140の内容をC/C++で書くと double P; P = 6.283 / N; for (int K = 0; K < N; K++) { A(K) = 0; B(K) = 0; for (int J = 0; J < N; J++) { A(K) = A(K) + X(J) * cos(P * J * K); B(K) = B(K) - X(J) * sin(P * J * K); } } // 150~190の内容をC/C++で書くと for (int I = 0; I < N; I++) { double Y; Y = sqrt(power(A(I), 2) + power(B(I), 2); pirntf("%d %7.3f %7.3f %7.3f\n", A(I), B(I), Y); } }