• 締切済み

離散フーリエ変換について

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言語に直したいのですがよく分かりません; お願いします@@;

みんなの回答

  • Schwarz20
  • ベストアンサー率46% (6/13)
回答No.1

ずいぶん懐かしい言語で書かれたソースですね この言語は、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);   } }

関連するQ&A