complex.h¤ò»È¤Ã¤¿FFT´Ø¿ô
ÍÑÅÓ¤¬·ã¤·¤¯¸Â¤é¤ì¤ë¡¢C¸À¸ì¤Ç½ñ¤«¤ì¤¿FFT(¹â®¥Õ¡¼¥ê¥¨ÊÑ´¹)´Ø¿ô¤Ç¤¹¡£Tomy's Home¤Ë·ÇºÜ¤µ¤ì¤Æ¤¤¤¿¤â¤Î¤ò¡¢C99¤ÇÄɲ䵤줿ɸ½à¥é¥¤¥Ö¥é¥êcomplex.h¤Îcomplex·¿¤ËÂбþ¤µ¤»¤Æ¤ß¤Þ¤·¤¿¡Ê¢¨C++¤Îɸ½à¥é¥¤¥Ö¥é¥ê¤Î¤â¤Î¤È¤Ï°ã¤¤¤Þ¤¹¡Ë¡£
complex·¿¤È¤Ï½ê°â Ê£ÁÇ¿ô·¿¤Î¤³¤È¤Ç¡¢¼ÂÉô¤ÈµõÉô¤òñ°ìÊÑ¿ô¤Ç°·¤¨¤Þ¤¹¡£¤³¤ì¤ò»È¤¨¤Ð¡¢¥³¡¼¥É¤¬Âçʬ¤¹¤Ã¤¤ê¤¹¤ë¤«¤â¡£
¤¿¤À¡¢Ì¤³Îǧ¤Ç¤¹¤¬¡¢GCC¤Ç¤·¤«Æ°¤«¤Ê¤¤¤È»×¤¤¤Þ¤¹¡£
ÍÑÅӤϡÄ´ÏÀ¤Ç»È¤¦¤°¤é¤¤¤«¤Ê¡Ä¡£
[fft.c]
»È¤¤Êý¤Ï¡¢ÅϤ¹ÇÛÎó¤¬complex·¿¤È¤¤¤¦°Ê³°¥³¥³¤ÈƱ¤¸¤Ç¤¹¡£
flag¤¬0¤Î¤È¤¤ÏÄ̾ï¤ÎFFT¤Ç¡¢1¤Î¤È¤¤ÏµÕFFT¤Ë¤Ê¤ê¤Þ¤¹¡£
fft1¤Îiter¤Ï¡¢Î㤨¤Ðn¤¬512¤À¤Ã¤¿¤é9¤È¤¤¤¦¤è¤¦¤Ë2¤Î¾è¿ô¤Î»Ø¿ôÉô¤ò»ØÄꤷ¤Æ²¼¤µ¤¤¡£
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>
void fft1(complex c[], int n, int iter, int flag)
{
int i, it, j, j1, j2, k, p, q, xp, xp2;
double arg, sign, w;
complex t, ww;
// »ØÄꥵ¥¤¥º¥Á¥§¥Ã¥¯
if (n < 2) {
fprintf(stderr, "Error : n < 2 in fft1()\n");
return;
}
if (iter <= 0) {
iter = 0;
i = n;
while((i /= 2) != 0) iter++;
}
j = 1;
for (i = 0; i < iter; i++) j *= 2;
if (n != j) {
fprintf(stderr, "Error : n != 2 ^ k in fft1()\n");
return;
}
sign = (flag == 1)? 1.: -1.;
xp2 = n;
for (it = 0; it < iter; it++) {
xp = xp2;
xp2 = xp / 2;
w = M_PI / xp2;
for (k = 0; k < xp2; k++) {
arg = k * w;
ww = cos(arg) + I * sign * sin(arg);
i = k - xp;
for (j = xp, p = i+xp, q = i+xp+xp2;
j <= n; j += xp, p += xp, q += xp) {
t = c[p] - c[q];
c[p] = c[p] + c[q];
c[q] = t * ww;
}
}
}
j1 = n / 2;
j2 = n - 1;
j = 1;
for (i = 1, p = 0; i <= j2; i++, p++) {
if (i < j) {
t = c[p];
c[p] = c[j-1];
c[j-1] = t;
}
k = j1;
while (k < j) {
j -= k;
k /= 2;
}
j += k;
}
if (flag == 0) return;
w = n;
for (i = 0, p = 0; i < n; i++, p++) c[p] = c[p] / w;
return;
}
void fft2(complex c[], int m, int n, int flag)
{
int i, iter, j, k, p;
complex *w;
// ¥µ¥¤¥º¥Á¥§¥Ã¥¯
if (m < 2) {
fprintf(stderr, "Error : Illegal parameter in fft2()\n");
return;
}
iter = 0;
i = m;
while ((i /= 2) != 0) iter++;
j = 1;
for (i = 1; i <= iter; i++) j *= 2;
if (m != j) {
fprintf(stderr, "Error : m != 2 ^ k in fft2()\n");
return;
}
w = (complex *)malloc(m * sizeof(complex));
if (!w) {
fprintf(stderr, "Error : Out of memory in fft2()\n");
return;
}
for (j = 0; j < n; j++, k += n) {
for (i = 0, p = j; i < m; i++, p += n) w[i] = c[p];
fft1(w, n, iter, flag);
for (i = 0, p = j; i < m; i++, p += n) c[p] = w[i];
}
for (i = k = 0; i < m; i++, k += n) {
for (j = 0, p = k; j < m; j++) w[j] = c[p++];
fft1(w, n, iter, flag);
for (j = 0, p = k; j < m; j++) c[p++] = w[j];
}
free(w);
}
- [2007/02/05 20:37]
- ¥×¥í¥°¥é¥ß¥ó¥° |
- Trackbacks(1) |
- Comments(2)
- ¤³¤Îµ»ö¤ÎURL |
- TOP ¢¥
¥³¥á¥ó¥È¤ÎÅê¹Æ
¥È¥é¥Ã¥¯¥Ð¥Ã¥¯
- ¤³¤Îµ»ö¤Î¥È¥é¥Ã¥¯¥Ð¥Ã¥¯URL
- http://yotama.blog84.fc2.com/tb.php/4-367a530b
FFT
FFTFFT* ¹â®¥Õ¡¼¥ê¥¨ÊÑ´¹ (Fast Fourier Transform)* ¥Õ¥¡¥¤¥Ê¥ë¥Õ¥¡¥ó¥¿¥¸¡¼¥¿¥¯¥Æ¥£¥¯¥¹ (FINAL FANTASY TACTICS)* ¥Õ¥í¥ó¥Æ¥£¥¢¹Ò¶õ¤Î¹ñºÝ̱´Ö¹Ò¶õµ¡´Ø|ICAO¹Ò¶õ²ñ¼Ò¥³¡¼¥É¡£ ¡¡FFT ´ØÏ¢¤¤¤í¤¤¤í¥Ö¥í¥°¾Ò²ð
¥³¥á¥ó¥È
C¸À¸ì¤É¤³¤ÇÊÙ¶¯¤·¤¿¤ó¤Ç¤¹¤«¡©
C¤Ï¼ç¤ËÂç³Ø¤Î¹ÖµÁ¤Ç¤Ç¤¹¡£
¤¿¤À¡¢¤³¤Î¥³¡¼¥É¤Ï»²¹Í¸µ¤Î¥â¥Î¤ò¾¯¤·Ï®¤Ã¤¿¤À¤±¤Ê¤Î¤Ç¡¢¼«Ê¬¤Ç½ñ¤¤¤¿¤È¤Ï¸À¤¨¤Ê¤¤¤±¤ì¤É¡Ä