poroguramuno

[戻る]
ミミ 2003/12/03(水) 18:59:34
このプログラムでx2[i]y2[i]の絶対値の2乗がほしいんですけどどうすればよろしいで
しょうか??(c1.txtはわたしの音声データです)

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

#define PI 3.14159265358979323846 

/*  sin  table */
static void make_sintbl(n, sintbl)
int n;
float *sintbl;
{
 int i, n2, n4, n8;
 double c, s, dc, ds, t;
 n2 = n / 2;  n4 = n / 4;  n8 = n / 8;
 t = sin(PI / n);
 dc = 2 * t * t;  ds = sqrt(dc * (2 - dc));
 t = 2 * dc;  
 c = sintbl[n4] = 1;  s = sintbl[0] = 0;
 for (i = 1; i < n8; i++) {
      c -= dc;  dc += t * c;
      s += ds;  ds -= t * s;
      sintbl[i] = s;  sintbl[n4 - i] = c;
      }
 if (n8 != 0) sintbl[n8] = sqrt(0.5);
 for (i = 0; i < n4; i++)
      sintbl[n2 - i] = sintbl[i];
 for (i = 0; i < (n2 + n4); i++)
      sintbl[i + n2] = - sintbl[i];
}

/*  Bit Reversal  */
static void make_bitrev(n, bitrev)
int n;
int *bitrev;
{
 int i, j, k, n2;
 n2 = n / 2;  i = j = 0;
 for (  ;  ;  ) {
      bitrev[i] = j;
      if (++i >= n) break;
      k = n2;
      while (k <= j) {  j -= k;  k /= 2;  }
    j += k;
      }
}

/*  FFT main routine */
int fft(n, x, y)
int n;
float *x;
float *y;
{
 static int    last_n = 0; 
 static int   *bitrev = NULL; 
 static float *sintbl = NULL; 
 int i, j, k, ik, h, d, k2, n4, inverse;
 float t, s, c, dx, dy;
  /* preparation */
   if (n < 0) {
       n = -n;  inverse = 1;
   } else inverse = 0;
   n4 = n / 4;
   if (n != last_n || n == 0) {
       last_n = n;
   if (sintbl != NULL) free(sintbl);
   if (bitrev != NULL) free(bitrev);
   if (n == 0) return 0;
 sintbl = malloc((n + n4) * sizeof(float));
 bitrev = malloc(n * sizeof(int));
 if (sintbl == NULL || bitrev == NULL) {
    fprintf(stderr, "Insufficient Memory\n");
    return 1;
    }
 make_sintbl(n, sintbl);
 make_bitrev(n, bitrev);
}
for (i = 0; i < n; i++) {
     j = bitrev[i];
     if (i < j) {
    t = x[i];  x[i] = x[j];  x[j] = t;
    t = y[i];  y[i] = y[j];  y[j] = t;
    }
     }
 for (k = 1; k < n; k = k2) {
      h = 0;  k2 = k + k;  d = n / k2;
      for (j = 0; j < k; j++) {
    c = sintbl[h + n4];
    if (inverse) s = - sintbl[h];
    else         s =   sintbl[h];
    for (i = j; i < n; i += k2) {
        ik = i + k;
        dx = s * y[ik] + c * x[ik];
        dy = c * y[ik] - s * x[ik];
        x[ik] = x[i] - dx;  x[i] += dx;
        y[ik] = y[i] - dy;  y[i] += dy;
        }
    h += d;
    }
 }
 if (! inverse)
    for (i = 0; i < n; i++) {
         x[i] /= n;  y[i] /= n;
    }
    return 0;
}

/*** Main Program ***/

#define N 256

int main(argc, argv)
int argc;
char *argv[];
 {
  FILE *fp;
  int i;
  static float x1[N], y1[N], x2[N], y2[N], x3[N], y3[N];
  if ((fp = fopen(c1.txt, "r")) ==NULL){
     printf ("File Open Error \"%s \" file.\n", c1.txt);
     exit(1);
      }
  for (i = 0; i < N; i++) {
       fscanf(fp, "%f", &x1[i]);
       x2[i] = x1[i]  ;
       y1[i] = y2[i] = 0;
       }
   if (fft(N, x2, y2)) return EXIT_FAILURE;
   for (i = 0; i < N; i++) {
        x3[i] = x2[i];  y3[i] = y2[i];
        }
   if (fft(-N, x3, y3)) return EXIT_FAILURE;
   printf("      Original data    Fourier Transformed  Inverse Transformed\n");
   for (i = 0; i < N; i++)
        printf("%4d | %6.3f %6.3f | %6.3f %6.3f | %6.3f %6.3f\n",
        i, x1[i], y1[i], x2[i], y2[i], x3[i], y3[i]);
   return EXIT_SUCCESS;
}

ミミ 2003/12/03(水) 19:01:53
ごめんなさい題名がおかしくなってしまいました。
「プログラムについてよろしくお願いします」

tib 2003/12/03(水) 20:23:49
> x2[i]y2[i]の絶対値の2乗がほしい
元の数が正だろうが負だろうが、2乗すれば符号はとれるから、
「x2[i] * x2[i]」「y2[i] * y2[i]」でいいのでは?

# こういうことを訊きたいのではない?

> ごめんなさい題名がおかしくなってしまいました。
>「プログラムについてよろしくお願いします」
これも「適切な題名」とはいえません。もっと内容を具体的に表してください。例えば
「絶対値の2乗が得られない」とか。「〜〜できない」「〜〜が解らない」というパター
ンに統一するといいでしょう。

__ 2003/12/03(水) 21:57:20
たぶんx2が実部、y2が虚部でしょうから
x2[i]*x2[i] + y2[i]*y2[i] 
ですかね

ミミ 2003/12/04(木) 07:36:49
x2[i]*x[i]+y2[i]*y2[i]をどこに入れればその結果を得られえるのでしょうか??

アイススケーター 2003/12/04(木) 07:55:37
うーん、あなたがこのプログムで何をされたいのかが解らないため、
どうすればいいかが他人にはわからないと思います。
ひょっとして、何かの課題のためあなた自身もどうしたらいいのか解らないとか。

ちなみに、他人にソースを見てもらう場合は最低限のコメントは入れましょう。
これでも他人のソースは見慣れているほうですが、これだけ長いソース(しかも技術計算)を
コメント無しで理解するのは非常につらいです。

古いスレッドには追加発言できません。