📄 fftcx512(ryh).c
字号:
#include <math.h>
/*
512 Points FFTi
整数FFT
By Redroof
2004,7月18
1.00版
*/
static const int uuTable[512]=
{
0, 256, 128, 384, 64, 320, 192, 448, 32, 288, 160, 416, 96, 352, 224, 480,
16, 272, 144, 400, 80, 336, 208, 464, 48, 304, 176, 432, 112, 368, 240, 496,
8, 264, 136, 392, 72, 328, 200, 456, 40, 296, 168, 424, 104, 360, 232, 488,
24, 280, 152, 408, 88, 344, 216, 472, 56, 312, 184, 440, 120, 376, 248, 504,
4, 260, 132, 388, 68, 324, 196, 452, 36, 292, 164, 420, 100, 356, 228, 484,
20, 276, 148, 404, 84, 340, 212, 468, 52, 308, 180, 436, 116, 372, 244, 500,
12, 268, 140, 396, 76, 332, 204, 460, 44, 300, 172, 428, 108, 364, 236, 492,
28, 284, 156, 412, 92, 348, 220, 476, 60, 316, 188, 444, 124, 380, 252, 508,
2, 258, 130, 386, 66, 322, 194, 450, 34, 290, 162, 418, 98, 354, 226, 482,
18, 274, 146, 402, 82, 338, 210, 466, 50, 306, 178, 434, 114, 370, 242, 498,
10, 266, 138, 394, 74, 330, 202, 458, 42, 298, 170, 426, 106, 362, 234, 490,
26, 282, 154, 410, 90, 346, 218, 474, 58, 314, 186, 442, 122, 378, 250, 506,
6, 262, 134, 390, 70, 326, 198, 454, 38, 294, 166, 422, 102, 358, 230, 486,
22, 278, 150, 406, 86, 342, 214, 470, 54, 310, 182, 438, 118, 374, 246, 502,
14, 270, 142, 398, 78, 334, 206, 462, 46, 302, 174, 430, 110, 366, 238, 494,
30, 286, 158, 414, 94, 350, 222, 478, 62, 318, 190, 446, 126, 382, 254, 510,
1, 257, 129, 385, 65, 321, 193, 449, 33, 289, 161, 417, 97, 353, 225, 481,
17, 273, 145, 401, 81, 337, 209, 465, 49, 305, 177, 433, 113, 369, 241, 497,
9, 265, 137, 393, 73, 329, 201, 457, 41, 297, 169, 425, 105, 361, 233, 489,
25, 281, 153, 409, 89, 345, 217, 473, 57, 313, 185, 441, 121, 377, 249, 505,
5, 261, 133, 389, 69, 325, 197, 453, 37, 293, 165, 421, 101, 357, 229, 485,
21, 277, 149, 405, 85, 341, 213, 469, 53, 309, 181, 437, 117, 373, 245, 501,
13, 269, 141, 397, 77, 333, 205, 461, 45, 301, 173, 429, 109, 365, 237, 493,
29, 285, 157, 413, 93, 349, 221, 477, 61, 317, 189, 445, 125, 381, 253, 509,
3, 259, 131, 387, 67, 323, 195, 451, 35, 291, 163, 419, 99, 355, 227, 483,
19, 275, 147, 403, 83, 339, 211, 467, 51, 307, 179, 435, 115, 371, 243, 499,
11, 267, 139, 395, 75, 331, 203, 459, 43, 299, 171, 427, 107, 363, 235, 491,
27, 283, 155, 411, 91, 347, 219, 475, 59, 315, 187, 443, 123, 379, 251, 507,
7, 263, 135, 391, 71, 327, 199, 455, 39, 295, 167, 423, 103, 359, 231, 487,
23, 279, 151, 407, 87, 343, 215, 471, 55, 311, 183, 439, 119, 375, 247, 503,
15, 271, 143, 399, 79, 335, 207, 463, 47, 303, 175, 431, 111, 367, 239, 495,
31, 287, 159, 415, 95, 351, 223, 479, 63, 319, 191, 447, 127, 383, 255, 511
};
static const int cos_tab[512]=
{
4096, 4095, 4094, 4093, 4091, 4088, 4084, 4080, 4076, 4071, 4065, 4058, 4051, 4043, 4035, 4026,
4017, 4007, 3996, 3985, 3973, 3960, 3947, 3933, 3919, 3904, 3889, 3873, 3856, 3839, 3821, 3803,
3784, 3764, 3744, 3723, 3702, 3680, 3658, 3635, 3612, 3588, 3563, 3538, 3513, 3487, 3460, 3433,
3405, 3377, 3348, 3319, 3289, 3259, 3229, 3197, 3166, 3134, 3101, 3068, 3034, 3000, 2966, 2931,
2896, 2860, 2824, 2787, 2750, 2713, 2675, 2637, 2598, 2559, 2519, 2480, 2439, 2399, 2358, 2317,
2275, 2233, 2191, 2148, 2105, 2062, 2018, 1975, 1930, 1886, 1841, 1796, 1751, 1705, 1659, 1613,
1567, 1520, 1474, 1427, 1379, 1332, 1284, 1237, 1189, 1140, 1092, 1043, 995, 946, 897, 848,
799, 749, 700, 650, 601, 551, 501, 451, 401, 351, 301, 251, 200, 150, 100, 50,
0, -50, -100, -150, -200, -251, -301, -351, -401, -451, -501, -551, -601, -650, -700, -749,
-799, -848, -897, -946, -995, -1043, -1092, -1140, -1189, -1237, -1284, -1332, -1379, -1427, -1474, -1520,
-1567, -1613, -1659, -1705, -1751, -1796, -1841, -1886, -1930, -1975, -2018, -2062, -2105, -2148, -2191, -2233,
-2275, -2317, -2358, -2399, -2439, -2480, -2519, -2559, -2598, -2637, -2675, -2713, -2750, -2787, -2824, -2860,
-2896, -2931, -2966, -3000, -3034, -3068, -3101, -3134, -3166, -3197, -3229, -3259, -3289, -3319, -3348, -3377,
-3405, -3433, -3460, -3487, -3513, -3538, -3563, -3588, -3612, -3635, -3658, -3680, -3702, -3723, -3744, -3764,
-3784, -3803, -3821, -3839, -3856, -3873, -3889, -3904, -3919, -3933, -3947, -3960, -3973, -3985, -3996, -4007,
-4017, -4026, -4035, -4043, -4051, -4058, -4065, -4071, -4076, -4080, -4084, -4088, -4091, -4093, -4094, -4095,
-4096, -4095, -4094, -4093, -4091, -4088, -4084, -4080, -4076, -4071, -4065, -4058, -4051, -4043, -4035, -4026,
-4017, -4007, -3996, -3985, -3973, -3960, -3947, -3933, -3919, -3904, -3889, -3873, -3856, -3839, -3821, -3803,
-3784, -3764, -3744, -3723, -3702, -3680, -3658, -3635, -3612, -3588, -3563, -3538, -3513, -3487, -3460, -3433,
-3405, -3377, -3348, -3319, -3289, -3259, -3229, -3197, -3166, -3134, -3101, -3068, -3034, -3000, -2966, -2931,
-2896, -2860, -2824, -2787, -2750, -2713, -2675, -2637, -2598, -2559, -2519, -2480, -2439, -2399, -2358, -2317,
-2275, -2233, -2191, -2148, -2105, -2062, -2018, -1975, -1930, -1886, -1841, -1796, -1751, -1705, -1659, -1613,
-1567, -1520, -1474, -1427, -1379, -1332, -1284, -1237, -1189, -1140, -1092, -1043, -995, -946, -897, -848,
-799, -749, -700, -650, -601, -551, -501, -451, -401, -351, -301, -251, -200, -150, -100, -50,
0, 50, 100, 150, 200, 251, 301, 351, 401, 451, 501, 551, 601, 650, 700, 749,
799, 848, 897, 946, 995, 1043, 1092, 1140, 1189, 1237, 1284, 1332, 1379, 1427, 1474, 1520,
1567, 1613, 1659, 1705, 1751, 1796, 1841, 1886, 1930, 1975, 2018, 2062, 2105, 2148, 2191, 2233,
2275, 2317, 2358, 2399, 2439, 2480, 2519, 2559, 2598, 2637, 2675, 2713, 2750, 2787, 2824, 2860,
2896, 2931, 2966, 3000, 3034, 3068, 3101, 3134, 3166, 3197, 3229, 3259, 3289, 3319, 3348, 3377,
3405, 3433, 3460, 3487, 3513, 3538, 3563, 3588, 3612, 3635, 3658, 3680, 3702, 3723, 3744, 3764,
3784, 3803, 3821, 3839, 3856, 3873, 3889, 3904, 3919, 3933, 3947, 3960, 3973, 3985, 3996, 4007,
4017, 4026, 4035, 4043, 4051, 4058, 4065, 4071, 4076, 4080, 4084, 4088, 4091, 4093, 4094, 4095
};
static const int sin_tab[512]=
{
0, 50, 100, 150, 200, 251, 301, 351, 401, 451, 501, 551, 601, 650, 700, 749,
799, 848, 897, 946, 995, 1043, 1092, 1140, 1189, 1237, 1284, 1332, 1379, 1427, 1474, 1520,
1567, 1613, 1659, 1705, 1751, 1796, 1841, 1886, 1930, 1975, 2018, 2062, 2105, 2148, 2191, 2233,
2275, 2317, 2358, 2399, 2439, 2480, 2519, 2559, 2598, 2637, 2675, 2713, 2750, 2787, 2824, 2860,
2896, 2931, 2966, 3000, 3034, 3068, 3101, 3134, 3166, 3197, 3229, 3259, 3289, 3319, 3348, 3377,
3405, 3433, 3460, 3487, 3513, 3538, 3563, 3588, 3612, 3635, 3658, 3680, 3702, 3723, 3744, 3764,
3784, 3803, 3821, 3839, 3856, 3873, 3889, 3904, 3919, 3933, 3947, 3960, 3973, 3985, 3996, 4007,
4017, 4026, 4035, 4043, 4051, 4058, 4065, 4071, 4076, 4080, 4084, 4088, 4091, 4093, 4094, 4095,
4096, 4095, 4094, 4093, 4091, 4088, 4084, 4080, 4076, 4071, 4065, 4058, 4051, 4043, 4035, 4026,
4017, 4007, 3996, 3985, 3973, 3960, 3947, 3933, 3919, 3904, 3889, 3873, 3856, 3839, 3821, 3803,
3784, 3764, 3744, 3723, 3702, 3680, 3658, 3635, 3612, 3588, 3563, 3538, 3513, 3487, 3460, 3433,
3405, 3377, 3348, 3319, 3289, 3259, 3229, 3197, 3166, 3134, 3101, 3068, 3034, 3000, 2966, 2931,
2896, 2860, 2824, 2787, 2750, 2713, 2675, 2637, 2598, 2559, 2519, 2480, 2439, 2399, 2358, 2317,
2275, 2233, 2191, 2148, 2105, 2062, 2018, 1975, 1930, 1886, 1841, 1796, 1751, 1705, 1659, 1613,
1567, 1520, 1474, 1427, 1379, 1332, 1284, 1237, 1189, 1140, 1092, 1043, 995, 946, 897, 848,
799, 749, 700, 650, 601, 551, 501, 451, 401, 351, 301, 251, 200, 150, 100, 50,
0, -50, -100, -150, -200, -251, -301, -351, -401, -451, -501, -551, -601, -650, -700, -749,
-799, -848, -897, -946, -995, -1043, -1092, -1140, -1189, -1237, -1284, -1332, -1379, -1427, -1474, -1520,
-1567, -1613, -1659, -1705, -1751, -1796, -1841, -1886, -1930, -1975, -2018, -2062, -2105, -2148, -2191, -2233,
-2275, -2317, -2358, -2399, -2439, -2480, -2519, -2559, -2598, -2637, -2675, -2713, -2750, -2787, -2824, -2860,
-2896, -2931, -2966, -3000, -3034, -3068, -3101, -3134, -3166, -3197, -3229, -3259, -3289, -3319, -3348, -3377,
-3405, -3433, -3460, -3487, -3513, -3538, -3563, -3588, -3612, -3635, -3658, -3680, -3702, -3723, -3744, -3764,
-3784, -3803, -3821, -3839, -3856, -3873, -3889, -3904, -3919, -3933, -3947, -3960, -3973, -3985, -3996, -4007,
-4017, -4026, -4035, -4043, -4051, -4058, -4065, -4071, -4076, -4080, -4084, -4088, -4091, -4093, -4094, -4095,
-4096, -4095, -4094, -4093, -4091, -4088, -4084, -4080, -4076, -4071, -4065, -4058, -4051, -4043, -4035, -4026,
-4017, -4007, -3996, -3985, -3973, -3960, -3947, -3933, -3919, -3904, -3889, -3873, -3856, -3839, -3821, -3803,
-3784, -3764, -3744, -3723, -3702, -3680, -3658, -3635, -3612, -3588, -3563, -3538, -3513, -3487, -3460, -3433,
-3405, -3377, -3348, -3319, -3289, -3259, -3229, -3197, -3166, -3134, -3101, -3068, -3034, -3000, -2966, -2931,
-2896, -2860, -2824, -2787, -2750, -2713, -2675, -2637, -2598, -2559, -2519, -2480, -2439, -2399, -2358, -2317,
-2275, -2233, -2191, -2148, -2105, -2062, -2018, -1975, -1930, -1886, -1841, -1796, -1751, -1705, -1659, -1613,
-1567, -1520, -1474, -1427, -1379, -1332, -1284, -1237, -1189, -1140, -1092, -1043, -995, -946, -897, -848,
-799, -749, -700, -650, -601, -551, -501, -451, -401, -351, -301, -251, -200, -150, -100, -50
};
main(){
int dat[512]={0};
int aa[128]={10};
fft(cos_tab[512],dat[512],aa[128]);
}
fft(int dataR[512],int dataI[512],int freq[128])
{
/* //dataR,dataI数据的实部和虚部 ,freq:最终的结果,频谱 */
int x0,x1,x2,x3,x4,x5,x6;
int L,j,k,b,p;
int i,xx;
int TR,TI,temp;
float fx1,fx2;
/*//-------------------------------------------- */
for(i=0;i<512;i++)
{
dataI[i]=dataR[uuTable[i]]>>2;
}
for(i=0;i<512;i++)
{
dataR[i]=dataI[i];
dataI[i]=0;
}
/* //上面是码位倒读
//下面是FFT */
for(L=1;L<=9;L++)
{
/* for(1) */
b=1; i=L-1;
while(i>0)
{
b=b*2;
i--;
} /* b= 2^(L-1) */
for(j=0;j<=b-1;j++) /* for (2) */
{
p=1;
i=9-L;
while(i>0) /* p=pow(2,7-L)*j; */
{
p=p*2;
i--;
}
p=p*j;
for(k=j;k<512;k=k+2*b) /* for (3) */
{
TR=dataR[k];
TI=dataI[k];
temp=dataR[k+b];
dataR[k]=dataR[k]+(((long int)dataR[k+b]*(long int)cos_tab[p])>>12)+(((long int)dataI[k+b]*(long int)sin_tab[p])>>12);
dataI[k]=dataI[k]-((long int)(dataR[k+b]*(long int)sin_tab[p])>>12)+(((long int)dataI[k+b]*(long int)cos_tab[p])>>12);
dataR[k+b]=TR-(((long int)dataR[k+b]*(long int)cos_tab[p])>>12)-(((long int)dataI[k+b]*(long int)sin_tab[p])>>12);
dataI[k+b]=TI+(((long int)temp*(long int)sin_tab[p])>>12)-(((long int)dataI[k+b]*(long int)cos_tab[p])>>12);
} /* END for (3) */
k++;
k--;
} /* END for (2) */
} /* END for (1) */
for(i=0;i<128;i++)
{ /* 对64次以下的谐波进行分析 */
fx1=(long int)((float)(dataR[i]>>4)*(float)(dataR[i]>>4)+(float)(dataI[i]>>4)*(float)(dataI[i]>>4));
freq[i]=(int)sqrt(fx1);
printf("%d, ",freq[i]);
/* // freq[i]=freq[i]>>2; */
}
freq[0]=freq[0]>>2;
getch();
}; /* END FFT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -