采用查表法计算FFT

24 篇文章 2 订阅

使用查表法计算快速傅里叶变换会快一些,本文采用了128点浮点(float)和定点(fix)型的处理,还有64点,包括MATLAB的程序和C语言的程序一一对应,与MATLAB自带的fft运算结果有对比。

已归纳,方便下次直接使用。

先上运行结果,采用统一一组数据sourcdata =[]; // 这里的数据比较大,因为做过处理

MATLAB自带fft运行结果与查表法编写的运行结果对比:

C语言对应程序运行结果(这里C语言采用了定点型,相对于matlab程序也做了处理)

MATLAB 程序

%% matlab编写的处理fft的程序,N点可以在函数里面设置
% input:需要处理的数组 sourcedata usefloat: 1 使用浮点型 0 使用定点型 N为FFT的点数 32 64 128... 16点的表格未填,可以自己补充
% output:处理后的数组
function destdata = MatlabFFT(sourcedata, usefloat, N) 

if usefloat == 0
    Ndiv = 127;
else
    Ndiv = 1;
end

[sin_tabb, cos_tabb, BRTable]= GetSinCosBRT(N, usefloat); % 获得查表值

SAMPLE_NUM = N;
LOG = log2(N);

FftReal = zeros(1,SAMPLE_NUM);
FftImage = zeros(1, SAMPLE_NUM);
result = zeros(1, SAMPLE_NUM);
arr = sourcedata; % 为了写程序

for i = length(sourcedata) + 1:SAMPLE_NUM
    arr(i) = 0;
end

BRTable = BRTable + 1; % matlab下标必须从1开始,C语言从0开始

for i = 1: SAMPLE_NUM     
    FftReal(BRTable(i) ) = arr(i); % 对应下标都+1,1-128
    FftImage(i) = 0;
    %fprintf('%d  ', arr(i));
end   

if usefloat == 0
    for i = 1:LOG
        bb = 2^(i - 1);
        for j = 0:bb - 1 % C语言从下标0开始,MATLAB从1开始
            p = j* 2^(LOG-i) + 1;  
            for k = j + 1:2^i:SAMPLE_NUM
                TR = GetFixData(FftReal(k + bb)*cos_tabb(p)/Ndiv) + GetFixData(FftImage(k+bb)*sin_tabb(p)/Ndiv);
                TI = GetFixData(FftImage(k + bb)*cos_tabb(p)/Ndiv) - GetFixData(FftReal(k + bb)*sin_tabb(p)/Ndiv);

                FftReal(k + bb) = FftReal(k ) - TR;
                FftImage(k + bb) = FftImage(k ) - TI;

                FftReal(k) = FftReal(k) + TR;
                FftImage(k) = FftImage(k) + TI;
            end                     
        end
    end
    for i = 1: SAMPLE_NUM
        FftReal(i) = GetFixData(FftReal(i));  % 这里的数值平方后超过int32_t,需要处理一下
        FftImage(i) = GetFixData(FftImage(i));
        ulReal = FftReal(i) * FftReal(i);
        ulImage = FftImage(i) * FftImage(i);      
        result(i) = GetFixData(sqrt(ulReal + ulImage));
        %fprintf('%d, %d, %d, %d. \r\n',i,ulReal,ulImage, result(i));
    end
else
    for i = 1:LOG
        bb = 2^(i - 1);
        for j = 0:bb - 1 % C语言从下标0开始,MATLAB从1开始
            p = j* 2^(LOG-i) + 1;  
            for k = j + 1:2^i:SAMPLE_NUM
                TR = FftReal(k + bb)*cos_tabb(p)/Ndiv + FftImage(k+bb)*sin_tabb(p)/Ndiv;
                TI = FftImage(k + bb)*cos_tabb(p)/Ndiv - FftReal(k + bb)*sin_tabb(p)/Ndiv;

                FftReal(k + bb) = FftReal(k ) - TR;
                FftImage(k + bb) = FftImage(k ) - TI;

                FftReal(k) = FftReal(k) + TR;
                FftImage(k) = FftImage(k) + TI;
            end                     
        end
    end
    for i = 1: SAMPLE_NUM
        FftReal(i) = FftReal(i);  % 这里的数值平方后超过int32_t,需要处理一下
        FftImage(i) = FftImage(i);
        ulReal = FftReal(i) * FftReal(i);
        ulImage = FftImage(i) * FftImage(i);      
        result(i) = sqrt(ulReal + ulImage);
        %fprintf('%d, %d, %d, %d. \r\n',i,ulReal,ulImage, result(i));
    end
end

    destdata = result;    
end

function [sin_tabb, cos_tabb, BRTable]= GetSinCosBRT(N, usefloat)


if N == 256 
BRTable =[    0,  128,  64,  192,  32,  160,  96,  224, ...
    16,  144,  80,  208,  48,  176,  112,  240,...
    8,  136,  72,  200,  40,  168,  104,  232,...
    24,  152,  88,  216,  56,  184,  120,  248,...
    4,  132,  68,  196,  36,  164,  100,  228,...
    20,  148,  84,  212,  52,  180,  116,  244,...
    12,  140,  76,  204,  44,  172,  108,  236,...
    28,  156,  92,  220,  60,  188,  124,  252,...
    2,  130,  66,  194,  34,  162,  98,  226,...
    18,  146,  82,  210,  50,  178,  114,  242,...
    10,  138,  74,  202,  42,  170,  106,  234,...
    26,  154,  90,  218,  58,  186,  122,  250,...
    6,  134,  70,  198,  38,  166,  102,  230,...
    22,  150,  86,  214,  54,  182,  118,  246,...
    14,  142,  78,  206,  46,  174,  110,  238,...
    30,  158,  94,  222,  62,  190,  126,  254,...
    1,  129,  65,  193,  33,  161,  97,  225,...
    17,  145,  81,  209,  49,  177,  113,  241,...
    9,  137,  73,  201,  41,  169,  105,  233,...
    25,  153,  89,  217,  57,  185,  121,  249,...
    5,  133,  69,  197,  37,  165,  101,  229,...
    21,  149,  85,  213,  53,  181,  117,  245,...
    13,  141,  77,  205,  45,  173,  109,  237,...
    29,  157,  93,  221,  61,  189,  125,  253,...
    3,  131,  67,  195,  35,  163,  99,  227,...
    19,  147,  83,  211,  51,  179,  115,  243,...
    11,  139,  75,  203,  43,  171,  107,  235,...
    27,  155,  91,  219,  59,  187,  123,  251,...
    7,  135,  71,  199,  39,  167,  103,  231,...
    23,  151,  87,  215,  55,  183,  119,  247,...
    15,  143,  79,  207,  47,  175,  111,  239,...
    31,  159,  95,  223,  63,  191,  127,  255,...
];

if usefloat == 1
sin_tabb = [
    0.000000,  0.024541,  0.049068,  0.073565,  0.098017,  0.122411,  0.146730,  0.170962,...
    0.195090,  0.219101,  0.242980,  0.266713,  0.290285,  0.313682,  0.336890,  0.359895,...
    0.382683,  0.405241,  0.427555,  0.449611,  0.471397,  0.492898,  0.514103,  0.534998,...
    0.555570,  0.575808,  0.595699,  0.615232,  0.634393,  0.653173,  0.671559,  0.689541,...
    0.707107,  0.724247,  0.740951,  0.757209,  0.773010,  0.788346,  0.803208,  0.817585,...
    0.831470,  0.844854,  0.857729,  0.870087,  0.881921,  0.893224,  0.903989,  0.914210,...
    0.923880,  0.932993,  0.941544,  0.949528,  0.956940,  0.963776,  0.970031,  0.975702,...
    0.980785,  0.985278,  0.989177,  0.992480,  0.995185,  0.997290,  0.998795,  0.999699,...
    1.000000,  0.999699,  0.998795,  0.997290,  0.995185,  0.992480,  0.989177,  0.985278,...
    0.980785,  0.975702,  0.970031,  0.963776,  0.956940,  0.949528,  0.941544,  0.932993,...
    0.923880,  0.914210,  0.903989,  0.893224,  0.881921,  0.870087,  0.857729,  0.844854,...
    0.831470,  0.817585,  0.803208,  0.788346,  0.773010,  0.757209,  0.740951,  0.724247,...
    0.707107,  0.689541,  0.671559,  0.653173,  0.634393,  0.615232,  0.595699,  0.575808,...
    0.555570,  0.534998,  0.514103,  0.492898,  0.471397,  0.449611,  0.427555,  0.405241,...
    0.382683,  0.359895,  0.336890,  0.313682,  0.290285,  0.266713,  0.242980,  0.219101,...
    0.195090,  0.170962,  0.146731,  0.122411,  0.098017,  0.073565,  0.049068,  0.024541,...
    0.000000,  -0.024541,  -0.049068,  -0.073565,  -0.098017,  -0.122411,  -0.146730,  -0.170962,...
    -0.195090,  -0.219101,  -0.242980,  -0.266713,  -0.290285,  -0.313682,  -0.336890,  -0.359895,...
    -0.382683,  -0.405241,  -0.427555,  -0.449611,  -0.471397,  -0.492898,  -0.514103,  -0.534998,...
    -0.555570,  -0.575808,  -0.595699,  -0.615232,  -0.634393,  -0.653173,  -0.671559,  -0.689540,...
    -0.707107,  -0.724247,  -0.740951,  -0.757209,  -0.773010,  -0.788346,  -0.803207,  -0.817585,...
    -0.831470,  -0.844854,  -0.857729,  -0.870087,  -0.881921,  -0.893224,  -0.903989,  -0.914210,...
    -0.923880,  -0.932993,  -0.941544,  -0.949528,  -0.956940,  -0.963776,  -0.970031,  -0.975702,...
    -0.980785,  -0.985278,  -0.989176,  -0.992480,  -0.995185,  -0.997290,  -0.998795,  -0.999699,...
    -1.000000,  -0.999699,  -0.998795,  -0.997290,  -0.995185,  -0.992480,  -0.989177,  -0.985278,...
    -0.980785,  -0.975702,  -0.970031,  -0.963776,  -0.956940,  -0.949528,  -0.941544,  -0.932993,...
    -0.923880,  -0.914210,  -0.903989,  -0.893224,  -0.881921,  -0.870087,  -0.857729,  -0.844854,...
    -0.831470,  -0.817585,  -0.803208,  -0.788346,  -0.773011,  -0.757209,  -0.740951,  -0.724247,...
    -0.707107,  -0.689541,  -0.671559,  -0.653173,  -0.634393,  -0.615232,  -0.595699,  -0.575808,...
    -0.555570,  -0.534998,  -0.514103,  -0.492898,  -0.471397,  -0.449611,  -0.427555,  -0.405241,...
    -0.382684,  -0.359895,  -0.336890,  -0.313682,  -0.290285,  -0.266713,  -0.242980,  -0.219101,...
    -0.195090,  -0.170962,  -0.146731,  -0.122411,  -0.098017,  -0.073565,  -0.049068,  -0.024541];
cos_tabb = [    1.000000,  0.999699,  0.998795,  0.997290,  0.995185,  0.992480,  0.989177,  0.985278,...
    0.980785,  0.975702,  0.970031,  0.963776,  0.956940,  0.949528,  0.941544,  0.932993,...
    0.923880,  0.914210,  0.903989,  0.893224,  0.881921,  0.870087,  0.857729,  0.844854,...
    0.831470,  0.817585,  0.803208,  0.788346,  0.773010,  0.757209,  0.740951,  0.724247,...
    0.707107,  0.689541,  0.671559,  0.653173,  0.634393,  0.615232,  0.595699,  0.575808,...
    0.555570,  0.534998,  0.514103,  0.492898,  0.471397,  0.449611,  0.427555,  0.405241,...
    0.382683,  0.359895,  0.336890,  0.313682,  0.290285,  0.266713,  0.242980,  0.219101,...
    0.195090,  0.170962,  0.146730,  0.122411,  0.098017,  0.073565,  0.049068,  0.024541,...
    0.000000,  -0.024541,  -0.049068,  -0.073565,  -0.098017,  -0.122411,  -0.146730,  -0.170962,...
    -0.195090,  -0.219101,  -0.242980,  -0.266713,  -0.290285,  -0.313682,  -0.336890,  -0.359895,...
    -0.382683,  -0.405241,  -0.427555,  -0.449611,  -0.471397,  -0.492898,  -0.514103,  -0.534998,...
    -0.555570,  -0.575808,  -0.595699,  -0.615232,  -0.634393,  -0.653173,  -0.671559,  -0.689541,...
    -0.707107,  -0.724247,  -0.740951,  -0.757209,  -0.773010,  -0.788346,  -0.803208,  -0.817585,...
    -0.831470,  -0.844854,  -0.857729,  -0.870087,  -0.881921,  -0.893224,  -0.903989,  -0.914210,...
    -0.923880,  -0.932993,  -0.941544,  -0.949528,  -0.956940,  -0.963776,  -0.970031,  -0.975702,...
    -0.980785,  -0.985278,  -0.989177,  -0.992480,  -0.995185,  -0.997290,  -0.998795,  -0.999699,...
    -1.000000,  -0.999699,  -0.998795,  -0.997290,  -0.995185,  -0.992480,  -0.989177,  -0.985278,...
    -0.980785,  -0.975702,  -0.970031,  -0.963776,  -0.956940,  -0.949528,  -0.941544,  -0.932993,...
    -0.923880,  -0.914210,  -0.903989,  -0.893224,  -0.881921,  -0.870087,  -0.857729,  -0.844854,...
    -0.831470,  -0.817585,  -0.803208,  -0.788346,  -0.773010,  -0.757209,  -0.740951,  -0.724247,...
    -0.707107,  -0.689541,  -0.671559,  -0.653173,  -0.634393,  -0.615232,  -0.595699,  -0.575808,...
    -0.555570,  -0.534998,  -0.514103,  -0.492898,  -0.471397,  -0.449611,  -0.427555,  -0.405241,...
    -0.382684,  -0.359895,  -0.336890,  -0.313682,  -0.290285,  -0.266713,  -0.242980,  -0.219101,...
    -0.195090,  -0.170962,  -0.146731,  -0.122411,  -0.098017,  -0.073565,  -0.049068,  -0.024541,...
    -0.000000,  0.024541,  0.049068,  0.073564,  0.098017,  0.122411,  0.146730,  0.170962,...
    0.195090,  0.219101,  0.242980,  0.266713,  0.290285,  0.313682,  0.336890,  0.359895,...
    0.382683,  0.405241,  0.427555,  0.449611,  0.471397,  0.492898,  0.514103,  0.534998,...
    0.555570,  0.575808,  0.595699,  0.615232,  0.634393,  0.653173,  0.671559,  0.689540,...
    0.707107,  0.724247,  0.740951,  0.757209,  0.773010,  0.788346,  0.803207,  0.817585,...
    0.831470,  0.844854,  0.857729,  0.870087,  0.881921,  0.893224,  0.903989,  0.914210,...
    0.923879,  0.932993,  0.941544,  0.949528,  0.956940,  0.963776,  0.970031,  0.975702,...
    0.980785,  0.985278,  0.989176,  0.992480,  0.995185,  0.997290,  0.998795,  0.999699,...
];
else
sin_tabb = [
    0,  3,  6,  9,  12,  15,  18,  21,...
    24,  27,  30,  33,  36,  39,  42,  45,...
    48,  51,  54,  57,  59,  62,  65,  67,...
    70,  73,  75,  78,  80,  82,  85,  87,...
    89,  91,  94,  96,  98,  100,  102,  103,...
    105,  107,  108,  110,  112,  113,  114,  116,...
    117,  118,  119,  120,  121,  122,  123,  123,...
    124,  125,  125,  126,  126,  126,  126,  126,...
    126,  126,  126,  126,  126,  126,  125,  125,...
    124,  123,  123,  122,  121,  120,  119,  118,...
    117,  116,  114,  113,  112,  110,  108,  107,...
    105,  103,  102,  100,  98,  96,  94,  91,...
    89,  87,  85,  82,  80,  78,  75,  73,...
    70,  67,  65,  62,  59,  57,  54,  51,...
    48,  45,  42,  39,  36,  33,  30,  27,...
    24,  21,  18,  15,  12,  9,  6,  3,...
    0,  -3,  -6,  -9,  -12,  -15,  -18,  -21,...
    -24,  -27,  -30,  -33,  -36,  -39,  -42,  -45,...
    -48,  -51,  -54,  -57,  -59,  -62,  -65,  -67,...
    -70,  -73,  -75,  -78,  -80,  -82,  -85,  -87,...
    -89,  -91,  -94,  -96,  -98,  -100,  -102,  -103,...
    -105,  -107,  -108,  -110,  -112,  -113,  -114,  -116,...
    -117,  -118,  -119,  -120,  -121,  -122,  -123,  -123,...
    -124,  -125,  -125,  -126,  -126,  -126,  -126,  -126,...
    -126,  -126,  -126,  -126,  -126,  -126,  -125,  -125,...
    -124,  -123,  -123,  -122,  -121,  -120,  -119,  -118,...
    -117,  -116,  -114,  -113,  -112,  -110,  -108,  -107,...
    -105,  -103,  -102,  -100,  -98,  -96,  -94,  -91,...
    -89,  -87,  -85,  -82,  -80,  -78,  -75,  -73,...
    -70,  -67,  -65,  -62,  -59,  -57,  -54,  -51,...
    -48,  -45,  -42,  -39,  -36,  -33,  -30,  -27,...
    -24,  -21,  -18,  -15,  -12,  -9,  -6,  -3
];   
cos_tabb= [
    127,  126,  126,  126,  126,  126,  125,  125, ...
    124,  123,  123,  122,  121,  120,  119,  118,...
    117,  116,  114,  113,  112,  110,  108,  107,...
    105,  103,  102,  100,  98,  96,  94,  91,...
    89,  87,  85,  82,  80,  78,  75,  73,...
    70,  67,  65,  62,  59,  57,  54,  51,...
    48,  45,  42,  39,  36,  33,  30,  27,...
    24,  21,  18,  15,  12,  9,  6,  3,...
    0,  -3,  -6,  -9,  -12,  -15,  -18,  -21,    -24,  -27,  -30,  -33,  -36,  -39,  -42,  -45,    -48,  -51,  -54,  -57,  -59,  -62,  -65,  -67,...
    -70,  -73,  -75,  -78,  -80,  -82,  -85,  -87,    -89,  -91,  -94,  -96,  -98,  -100,  -102,  -103,    -105,  -107,  -108,  -110,  -112,  -113,  -114,  -116,...
    -117,  -118,  -119,  -120,  -121,  -122,  -123,  -123,   -124,  -125,  -125,  -126,  -126,  -126,  -126,  -126,...
    -126,  -126,  -126,  -126,  -126,  -126,  -125,  -125,    -124,  -123,  -123,  -122,  -121,  -120,  -119,  -118,    -117,  -116,  -114,  -113,  -112,  -110,  -108,  -107,...
    -105,  -103,  -102,  -100,  -98,  -96,  -94,  -91,    -89,  -87,  -85,  -82,  -80,  -78,  -75,  -73,    -70,  -67,  -65,  -62,  -59,  -57,  -54,  -51,...
    -48,  -45,  -42,  -39,  -36,  -33,  -30,  -27,    -24,  -21,  -18,  -15,  -12,  -9,  -6,  -3,    0,  3,  6,  9,  12,  15,  18,  21,...
    24,  27,  30,  33,  36,  39,  42,  45,    48,  51,  54,  57,  59,  62,  65,  67,    70,  73,  75,  78,  80,  82,  85,  87,...
    89,  91,  94,  96,  98,  100,  102,  103,    105,  107,  108,  110,  112,  113,  114,  116,    117,  118,  119,  120,  121,  122,  123,  123,...
    124,  125,  125,  126,  126,  126,  126,  126,...
];
end
end


if N == 128
 BRTable =[0, 64, 32, 96, 16, 80, 48, 112,8, 72, 40, 104, 24, 88, 56, 120,4, 68, 36, 100, 20, 84, 52, 116,12, 76, 44, 108, 28, 92, 60, 124,2, 66, 34, 98, 18, 82, 50, 114,...
10, 74, 42, 106, 26, 90, 58, 122,6, 70, 38, 102, 22, 86, 54, 118,14, 78, 46, 110, 30, 94, 62, 126,1, 65, 33, 97, 17, 81, 49, 113,9, 73, 41, 105, 25, 89, 57, 121,...
5, 69, 37, 101, 21, 85, 53, 117,13, 77, 45, 109, 29, 93, 61, 125,3, 67, 35, 99, 19, 83, 51, 115,11, 75, 43, 107, 27, 91, 59, 123,7, 71, 39, 103, 23, 87, 55, 119,...
15, 79, 47, 111, 31, 95, 63, 127];

if usefloat == 1
sin_tabb = [
    0.000000,  0.049068,  0.098017,  0.146730,    0.195090,  0.242980,  0.290285,  0.336890,    0.382683,  0.427555,  0.471397,  0.514103,...
    0.555570,  0.595699,  0.634393,  0.671559,    0.707107,  0.740951,  0.773010,  0.803208,    0.831470,  0.857729,  0.881921,  0.903989,...
    0.923880,  0.941544,  0.956940,  0.970031,    0.980785,  0.989177,  0.995185,  0.998795,    1.000000,  0.998795,  0.995185,  0.989177,...
    0.980785,  0.970031,  0.956940,  0.941544,    0.923880,  0.903989,  0.881921,  0.857729,    0.831470,  0.803208,  0.773010,  0.740951,...
    0.707107,  0.671559,  0.634393,  0.595699,    0.555570,  0.514103,  0.471397,  0.427555,    0.382683,  0.336890,  0.290285,  0.242980,...
    0.195090,  0.146731,  0.098017,  0.049068,    0.000000,  -0.049068,  -0.098017,  -0.146730,    -0.195090,  -0.242980,  -0.290285,  -0.336890,...
    -0.382683,  -0.427555,  -0.471397,  -0.514103,    -0.555570,  -0.595699,  -0.634393,  -0.671559,    -0.707107,  -0.740951,  -0.773010,  -0.803207,...
    -0.831470,  -0.857729,  -0.881921,  -0.903989,    -0.923880,  -0.941544,  -0.956940,  -0.970031,    -0.980785,  -0.989176,  -0.995185,  -0.998795,...
    -1.000000,  -0.998795,  -0.995185,  -0.989177,    -0.980785,  -0.970031,  -0.956940,  -0.941544,    -0.923880,  -0.903989,  -0.881921,  -0.857729,...
    -0.831470,  -0.803208,  -0.773011,  -0.740951,    -0.707107,  -0.671559,  -0.634393,  -0.595699,    -0.555570,  -0.514103,  -0.471397,  -0.427555,...
    -0.382684,  -0.336890,  -0.290285,  -0.242980,    -0.195090,  -0.146731,  -0.098017,  -0.049068
];
 cos_tabb = [
    1.000000,  0.998795,  0.995185,  0.989177,    0.980785,  0.970031,  0.956940,  0.941544,    0.923880,  0.903989,  0.881921,  0.857729,...
    0.831470,  0.803208,  0.773010,  0.740951,    0.707107,  0.671559,  0.634393,  0.595699,    0.555570,  0.514103,  0.471397,  0.427555,...
    0.382683,  0.336890,  0.290285,  0.242980,    0.195090,  0.146730,  0.098017,  0.049068,    0.000000,  -0.049068,  -0.098017,  -0.146730,...
    -0.195090,  -0.242980,  -0.290285,  -0.336890,    -0.382683,  -0.427555,  -0.471397,  -0.514103,    -0.555570,  -0.595699,  -0.634393,  -0.671559,...
    -0.707107,  -0.740951,  -0.773010,  -0.803208,    -0.831470,  -0.857729,  -0.881921,  -0.903989,    -0.923880,  -0.941544,  -0.956940,  -0.970031,...
    -0.980785,  -0.989177,  -0.995185,  -0.998795,    -1.000000,  -0.998795,  -0.995185,  -0.989177,    -0.980785,  -0.970031,  -0.956940,  -0.941544,...
    -0.923880,  -0.903989,  -0.881921,  -0.857729,    -0.831470,  -0.803208,  -0.773010,  -0.740951,    -0.707107,  -0.671559,  -0.634393,  -0.595699,...
    -0.555570,  -0.514103,  -0.471397,  -0.427555,    -0.382684,  -0.336890,  -0.290285,  -0.242980,    -0.195090,  -0.146731,  -0.098017,  -0.049068,...
    -0.000000,  0.049068,  0.098017,  0.146730,    0.195090,  0.242980,  0.290285,  0.336890,    0.382683,  0.427555,  0.471397,  0.514103,...
    0.555570,  0.595699,  0.634393,  0.671559,    0.707107,  0.740951,  0.773010,  0.803207,    0.831470,  0.857729,  0.881921,  0.903989,...
    0.923879,  0.941544,  0.956940,  0.970031,    0.980785,  0.989176,  0.995185,  0.998795
];
else
 sin_tabb = {0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102, ...
     105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, ...
108, 105, 102, 98, 94, 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, ...
-36, -42, -48, -54, -59, -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, ...
-123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, ...
-98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6
};     

cos_tabb= {127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94, ...
89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, -36, -42, -48, -54, -59, ...
-65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -...
126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -89, -85, -80, ...
-75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6, 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, ...
75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126
};
end
end


if N == 16
BRTable =[
    0,  8,  4,  12,      2,  10,  6,  14,      1,  9,  5,  13,      3,  11,  7,  15
];

if usefloat == 1

 sin_tabb = [ % 可以自己补充

];

cos_tabb = [

];

else
 sin_tabb = [
    0,  48,  89,  117,    126,  117,  89,  48,    0,  -48,  -89,  -117,    -126,  -117,  -89,  -48
];  

 cos_tabb = [
    127,  117,  89,  48,    0,  -48,  -89,  -117,    -126,  -117,  -89,  -48,    0,  48,  89,  117
];

end
end

if N == 32
 BRTable ={
   0,  16,  8,  24,   4,  20,  12,  28,   2,  18,  10,  26,   6,  22,  14,  30,   1,  17,  9,  25,   5,  21,  13,  29,...
   3,  19,  11,  27,   7,  23,  15,  31,
};

if usefloat == 1
sin_tabb =[
0.000000,  0.195090,  0.382683,  0.555570,0.707107,  0.831470,  0.923880,  0.980785,1.000000,  0.980785,  0.923880,  0.831470,0.707107,  0.555570,  0.382683,  0.195090,...
0.000000,  -0.195090,  -0.382683,  -0.555570,-0.707107,  -0.831470,  -0.923880,  -0.980785,-1.000000,  -0.980785,  -0.923880,  -0.831470,-0.707107,  -0.555570,  -0.382684,  -0.195090,
];  

cos_tabb = [
  1.000000,  0.980785,  0.923880,  0.831470,0.707107,  0.555570,  0.382683,  0.195090,0.000000,  -0.195090,  -0.382683,  -0.555570,...
-0.707107,  -0.831470,  -0.923880,  -0.980785,-1.000000,  -0.980785,  -0.923880,  -0.831470,-0.707107,  -0.555570,  -0.382684,  -0.195090,...
-0.000000,  0.195090,  0.382683,  0.555570,0.707107,  0.831470,  0.923879,  0.980785
];
else
sin_tabb = [
    0,  24,  48,  70,    89,  105,  117,  124,    126,  124,  117,  105,    89,  70,  48,  24,    0,  -24,  -48,  -70,    -89,  -105,  -117,  -124,...
    -126,  -124,  -117,  -105,    -89,  -70,  -48,  -24,
];  

cos_tabb = [
   127,  124,  117,  105,   89,  70,  48,  24,   0,  -24,  -48,  -70,   -89,  -105,  -117,  -124,   -126,  -124,  -117,  -105,   -89,  -70,  -48,  -24,...
   0,  24,  48,  70,   89,  105,  117,  124,
];

end
end

if N == 64
  BRTable =[
       0,  32,  16,  48,  8,  40,  24,  56,       4,  36,  20,  52,  12,  44,  28,  60,       2,  34,  18,  50,  10,  42,  26,  58,       6,  38,  22,  54,  14,  46,  30,  62,...
       1,  33,  17,  49,  9,  41,  25,  57,       5,  37,  21,  53,  13,  45,  29,  61,       3,  35,  19,  51,  11,  43,  27,  59,       7,  39,  23,  55,  15,  47,  31,  63,             
    ];
    
  if usefloat == 1
    
       sin_tabb= [
        0.000000,  0.098017,  0.195090,  0.290285,  0.382683,  0.471397,  0.555570,  0.634393,...
        0.707107,  0.773010,  0.831470,  0.881921,  0.923880,  0.956940,  0.980785,  0.995185,...
        1.000000,  0.995185,  0.980785,  0.956940,  0.923880,  0.881921,  0.831470,  0.773010,...
        0.707107,  0.634393,  0.555570,  0.471397,  0.382683,  0.290285,  0.195090,  0.098017,...
        0.000000,  -0.098017,  -0.195090,  -0.290285,  -0.382683,  -0.471397,  -0.555570,  -0.634393,...
        -0.707107,  -0.773010,  -0.831470,  -0.881921,  -0.923880,  -0.956940,  -0.980785,  -0.995185,...
        -1.000000,  -0.995185,  -0.980785,  -0.956940,  -0.923880,  -0.881921,  -0.831470,  -0.773011,...
        -0.707107,  -0.634393,  -0.555570,  -0.471397,  -0.382684,  -0.290285,  -0.195090,  -0.098017, 
        ];  
        
         cos_tabb = [
          1.000000,  0.995185,  0.980785,  0.956940,  0.923880,  0.881921,  0.831470,  0.773010,...
          0.707107,  0.634393,  0.555570,  0.471397,  0.382683,  0.290285,  0.195090,  0.098017,...
          0.000000,  -0.098017,  -0.195090,  -0.290285,  -0.382683,  -0.471397,  -0.555570,  -0.634393,...
          -0.707107,  -0.773010,  -0.831470,  -0.881921,  -0.923880,  -0.956940,  -0.980785,  -0.995185,...
          -1.000000,  -0.995185,  -0.980785,  -0.956940,  -0.923880,  -0.881921,  -0.831470,  -0.773010,...
          -0.707107,  -0.634393,  -0.555570,  -0.471397,  -0.382684,  -0.290285,  -0.195090,  -0.098017,...
          -0.000000,  0.098017,  0.195090,  0.290285,  0.382683,  0.471397,  0.555570,  0.634393,...
          0.707107,  0.773010,  0.831470,  0.881921,  0.923879,  0.956940,  0.980785,  0.995185,...
        ];
    
  else
    
       sin_tabb = [
            0,  12,  24,  36,  48,  59,  70,  80,...
            89,  98,  105,  112,  117,  121,  124,  126,...
            126,  126,  124,  121,  117,  112,  105,  98,...
            89,  80,  70,  59,  48,  36,  24,  12,...
            0,  -12,  -24,  -36,  -48,  -59,  -70,  -80,...
            -89,  -98,  -105,  -112,  -117,  -121,  -124,  -126,...
            -126,  -126,  -124,  -121,  -117,  -112,  -105,  -98,...
            -89,  -80,  -70,  -59,  -48,  -36,  -24,  -12
        ];  
        
        cos_tabb = [
           127,  126,  124,  121,  117,  112,  105,  98,           89,  80,  70,  59,  48,  36,  24,  12,           0,  -12,  -24,  -36,  -48,  -59,  -70,  -80,...
           -89,  -98,  -105,  -112,  -117,  -121,  -124,  -126,           -126,  -126,  -124,  -121,  -117,  -112,  -105,  -98,   -89,  -80,  -70,  -59,  -48,  -36,  -24,  -12,...
           0,  12,  24,  36,  48,  59,  70,  80,           89,  98,  105,  112,  117,  121,  124,  126
        ];
  end
end



end

给出我自己测试使用的例子,自己使用前可以测试一下

%% 对于程序中需要测试的函数做个小小的测试
function  TestFunction()
data = [19  24  26  21  10  -1  -13  -25  -32  -34  -33  -28  -16  1  15  25  33  35  32  29 ...
    26  22  14  5  -3  -9  -14  -18  -19  -18  -15  -11  -5  3  11  17  21  19  12  2  -10  -20....
    -25  -25  -22  -17  -10  -3  5  13  19  24  26  21  10  -1  -13  -25  -32  -34  -33  -28  -16 ...
    1  15  25  33  35  32  29  26  22  14  5  -3  -9  -14  -18  -19  -18  -15  -11  -5  3  11  17 ...
    21  19  12  2  -10  -20  -25  -25  -22  -17  -10  -3  5  13 ];

refft = MatlabFFT(data, 1, 128);

if 1
    matlab_fft = fft(data, 128);
    resu_m = sqrt(real(matlab_fft).^2+ imag(matlab_fft).^2);
end
end

C语言程序, 使用N点,自己定义一下就可以 # define FFT_128

#if defined(FFT_256)

//256点FFT
#define SAMPLE_NUM 256
#define LOG 8 log2(256) = 8

//采样存储序列表
unsigned char BRTable[SAMPLE_NUM] ={
    0,  128,  64,  192,  32,  160,  96,  224,
    16,  144,  80,  208,  48,  176,  112,  240,
    8,  136,  72,  200,  40,  168,  104,  232,
    24,  152,  88,  216,  56,  184,  120,  248,
    4,  132,  68,  196,  36,  164,  100,  228,
    20,  148,  84,  212,  52,  180,  116,  244,
    12,  140,  76,  204,  44,  172,  108,  236,
    28,  156,  92,  220,  60,  188,  124,  252,
    2,  130,  66,  194,  34,  162,  98,  226,
    18,  146,  82,  210,  50,  178,  114,  242,
    10,  138,  74,  202,  42,  170,  106,  234,
    26,  154,  90,  218,  58,  186,  122,  250,
    6,  134,  70,  198,  38,  166,  102,  230,
    22,  150,  86,  214,  54,  182,  118,  246,
    14,  142,  78,  206,  46,  174,  110,  238,
    30,  158,  94,  222,  62,  190,  126,  254,
    1,  129,  65,  193,  33,  161,  97,  225,
    17,  145,  81,  209,  49,  177,  113,  241,
    9,  137,  73,  201,  41,  169,  105,  233,
    25,  153,  89,  217,  57,  185,  121,  249,
    5,  133,  69,  197,  37,  165,  101,  229,
    21,  149,  85,  213,  53,  181,  117,  245,
    13,  141,  77,  205,  45,  173,  109,  237,
    29,  157,  93,  221,  61,  189,  125,  253,
    3,  131,  67,  195,  35,  163,  99,  227,
    19,  147,  83,  211,  51,  179,  115,  243,
    11,  139,  75,  203,  43,  171,  107,  235,
    27,  155,  91,  219,  59,  187,  123,  251,
    7,  135,  71,  199,  39,  167,  103,  231,
    23,  151,  87,  215,  55,  183,  119,  247,
    15,  143,  79,  207,  47,  175,  111,  239,
    31,  159,  95,  223,  63,  191,  127,  255
};

#ifdef USE_FLOAT

double sin_tabb[SAMPLE_NUM] = {
    0.000000,  0.024541,  0.049068,  0.073565,  0.098017,  0.122411,  0.146730,  0.170962,
    0.195090,  0.219101,  0.242980,  0.266713,  0.290285,  0.313682,  0.336890,  0.359895,
    0.382683,  0.405241,  0.427555,  0.449611,  0.471397,  0.492898,  0.514103,  0.534998,
    0.555570,  0.575808,  0.595699,  0.615232,  0.634393,  0.653173,  0.671559,  0.689541,
    0.707107,  0.724247,  0.740951,  0.757209,  0.773010,  0.788346,  0.803208,  0.817585,
    0.831470,  0.844854,  0.857729,  0.870087,  0.881921,  0.893224,  0.903989,  0.914210,
    0.923880,  0.932993,  0.941544,  0.949528,  0.956940,  0.963776,  0.970031,  0.975702,
    0.980785,  0.985278,  0.989177,  0.992480,  0.995185,  0.997290,  0.998795,  0.999699,
    1.000000,  0.999699,  0.998795,  0.997290,  0.995185,  0.992480,  0.989177,  0.985278,
    0.980785,  0.975702,  0.970031,  0.963776,  0.956940,  0.949528,  0.941544,  0.932993,
    0.923880,  0.914210,  0.903989,  0.893224,  0.881921,  0.870087,  0.857729,  0.844854,
    0.831470,  0.817585,  0.803208,  0.788346,  0.773010,  0.757209,  0.740951,  0.724247,
    0.707107,  0.689541,  0.671559,  0.653173,  0.634393,  0.615232,  0.595699,  0.575808,
    0.555570,  0.534998,  0.514103,  0.492898,  0.471397,  0.449611,  0.427555,  0.405241,
    0.382683,  0.359895,  0.336890,  0.313682,  0.290285,  0.266713,  0.242980,  0.219101,
    0.195090,  0.170962,  0.146731,  0.122411,  0.098017,  0.073565,  0.049068,  0.024541,
    0.000000,  -0.024541,  -0.049068,  -0.073565,  -0.098017,  -0.122411,  -0.146730,  -0.170962,
    -0.195090,  -0.219101,  -0.242980,  -0.266713,  -0.290285,  -0.313682,  -0.336890,  -0.359895,
    -0.382683,  -0.405241,  -0.427555,  -0.449611,  -0.471397,  -0.492898,  -0.514103,  -0.534998,
    -0.555570,  -0.575808,  -0.595699,  -0.615232,  -0.634393,  -0.653173,  -0.671559,  -0.689540,
    -0.707107,  -0.724247,  -0.740951,  -0.757209,  -0.773010,  -0.788346,  -0.803207,  -0.817585,
    -0.831470,  -0.844854,  -0.857729,  -0.870087,  -0.881921,  -0.893224,  -0.903989,  -0.914210,
    -0.923880,  -0.932993,  -0.941544,  -0.949528,  -0.956940,  -0.963776,  -0.970031,  -0.975702,
    -0.980785,  -0.985278,  -0.989176,  -0.992480,  -0.995185,  -0.997290,  -0.998795,  -0.999699,
    -1.000000,  -0.999699,  -0.998795,  -0.997290,  -0.995185,  -0.992480,  -0.989177,  -0.985278,
    -0.980785,  -0.975702,  -0.970031,  -0.963776,  -0.956940,  -0.949528,  -0.941544,  -0.932993,
    -0.923880,  -0.914210,  -0.903989,  -0.893224,  -0.881921,  -0.870087,  -0.857729,  -0.844854,
    -0.831470,  -0.817585,  -0.803208,  -0.788346,  -0.773011,  -0.757209,  -0.740951,  -0.724247,
    -0.707107,  -0.689541,  -0.671559,  -0.653173,  -0.634393,  -0.615232,  -0.595699,  -0.575808,
    -0.555570,  -0.534998,  -0.514103,  -0.492898,  -0.471397,  -0.449611,  -0.427555,  -0.405241,
    -0.382684,  -0.359895,  -0.336890,  -0.313682,  -0.290285,  -0.266713,  -0.242980,  -0.219101,
    -0.195090,  -0.170962,  -0.146731,  -0.122411,  -0.098017,  -0.073565,  -0.049068,  -0.024541,
};

double cos_tabb[SAMPLE_NUM] = {
    1.000000,  0.999699,  0.998795,  0.997290,  0.995185,  0.992480,  0.989177,  0.985278,
    0.980785,  0.975702,  0.970031,  0.963776,  0.956940,  0.949528,  0.941544,  0.932993,
    0.923880,  0.914210,  0.903989,  0.893224,  0.881921,  0.870087,  0.857729,  0.844854,
    0.831470,  0.817585,  0.803208,  0.788346,  0.773010,  0.757209,  0.740951,  0.724247,
    0.707107,  0.689541,  0.671559,  0.653173,  0.634393,  0.615232,  0.595699,  0.575808,
    0.555570,  0.534998,  0.514103,  0.492898,  0.471397,  0.449611,  0.427555,  0.405241,
    0.382683,  0.359895,  0.336890,  0.313682,  0.290285,  0.266713,  0.242980,  0.219101,
    0.195090,  0.170962,  0.146730,  0.122411,  0.098017,  0.073565,  0.049068,  0.024541,
    0.000000,  -0.024541,  -0.049068,  -0.073565,  -0.098017,  -0.122411,  -0.146730,  -0.170962,
    -0.195090,  -0.219101,  -0.242980,  -0.266713,  -0.290285,  -0.313682,  -0.336890,  -0.359895,
    -0.382683,  -0.405241,  -0.427555,  -0.449611,  -0.471397,  -0.492898,  -0.514103,  -0.534998,
    -0.555570,  -0.575808,  -0.595699,  -0.615232,  -0.634393,  -0.653173,  -0.671559,  -0.689541,
    -0.707107,  -0.724247,  -0.740951,  -0.757209,  -0.773010,  -0.788346,  -0.803208,  -0.817585,
    -0.831470,  -0.844854,  -0.857729,  -0.870087,  -0.881921,  -0.893224,  -0.903989,  -0.914210,
    -0.923880,  -0.932993,  -0.941544,  -0.949528,  -0.956940,  -0.963776,  -0.970031,  -0.975702,
    -0.980785,  -0.985278,  -0.989177,  -0.992480,  -0.995185,  -0.997290,  -0.998795,  -0.999699,
    -1.000000,  -0.999699,  -0.998795,  -0.997290,  -0.995185,  -0.992480,  -0.989177,  -0.985278,
    -0.980785,  -0.975702,  -0.970031,  -0.963776,  -0.956940,  -0.949528,  -0.941544,  -0.932993,
    -0.923880,  -0.914210,  -0.903989,  -0.893224,  -0.881921,  -0.870087,  -0.857729,  -0.844854,
    -0.831470,  -0.817585,  -0.803208,  -0.788346,  -0.773010,  -0.757209,  -0.740951,  -0.724247,
    -0.707107,  -0.689541,  -0.671559,  -0.653173,  -0.634393,  -0.615232,  -0.595699,  -0.575808,
    -0.555570,  -0.534998,  -0.514103,  -0.492898,  -0.471397,  -0.449611,  -0.427555,  -0.405241,
    -0.382684,  -0.359895,  -0.336890,  -0.313682,  -0.290285,  -0.266713,  -0.242980,  -0.219101,
    -0.195090,  -0.170962,  -0.146731,  -0.122411,  -0.098017,  -0.073565,  -0.049068,  -0.024541,
    -0.000000,  0.024541,  0.049068,  0.073564,  0.098017,  0.122411,  0.146730,  0.170962,
    0.195090,  0.219101,  0.242980,  0.266713,  0.290285,  0.313682,  0.336890,  0.359895,
    0.382683,  0.405241,  0.427555,  0.449611,  0.471397,  0.492898,  0.514103,  0.534998,
    0.555570,  0.575808,  0.595699,  0.615232,  0.634393,  0.653173,  0.671559,  0.689540,
    0.707107,  0.724247,  0.740951,  0.757209,  0.773010,  0.788346,  0.803207,  0.817585,
    0.831470,  0.844854,  0.857729,  0.870087,  0.881921,  0.893224,  0.903989,  0.914210,
    0.923879,  0.932993,  0.941544,  0.949528,  0.956940,  0.963776,  0.970031,  0.975702,
    0.980785,  0.985278,  0.989176,  0.992480,  0.995185,  0.997290,  0.998795,  0.999699,
};

#else

char  sin_tabb[SAMPLE_NUM] = {
    0,  3,  6,  9,  12,  15,  18,  21,
    24,  27,  30,  33,  36,  39,  42,  45,
    48,  51,  54,  57,  59,  62,  65,  67,
    70,  73,  75,  78,  80,  82,  85,  87,
    89,  91,  94,  96,  98,  100,  102,  103,
    105,  107,  108,  110,  112,  113,  114,  116,
    117,  118,  119,  120,  121,  122,  123,  123,
    124,  125,  125,  126,  126,  126,  126,  126,
    126,  126,  126,  126,  126,  126,  125,  125,
    124,  123,  123,  122,  121,  120,  119,  118,
    117,  116,  114,  113,  112,  110,  108,  107,
    105,  103,  102,  100,  98,  96,  94,  91,
    89,  87,  85,  82,  80,  78,  75,  73,
    70,  67,  65,  62,  59,  57,  54,  51,
    48,  45,  42,  39,  36,  33,  30,  27,
    24,  21,  18,  15,  12,  9,  6,  3,
    0,  -3,  -6,  -9,  -12,  -15,  -18,  -21,
    -24,  -27,  -30,  -33,  -36,  -39,  -42,  -45,
    -48,  -51,  -54,  -57,  -59,  -62,  -65,  -67,
    -70,  -73,  -75,  -78,  -80,  -82,  -85,  -87,
    -89,  -91,  -94,  -96,  -98,  -100,  -102,  -103,
    -105,  -107,  -108,  -110,  -112,  -113,  -114,  -116,
    -117,  -118,  -119,  -120,  -121,  -122,  -123,  -123,
    -124,  -125,  -125,  -126,  -126,  -126,  -126,  -126,
    -126,  -126,  -126,  -126,  -126,  -126,  -125,  -125,
    -124,  -123,  -123,  -122,  -121,  -120,  -119,  -118,
    -117,  -116,  -114,  -113,  -112,  -110,  -108,  -107,
    -105,  -103,  -102,  -100,  -98,  -96,  -94,  -91,
    -89,  -87,  -85,  -82,  -80,  -78,  -75,  -73,
    -70,  -67,  -65,  -62,  -59,  -57,  -54,  -51,
    -48,  -45,  -42,  -39,  -36,  -33,  -30,  -27,
    -24,  -21,  -18,  -15,  -12,  -9,  -6,  -3
};     

char  cos_tabb[SAMPLE_NUM] = {
    127,  126,  126,  126,  126,  126,  125,  125,
    124,  123,  123,  122,  121,  120,  119,  118,
    117,  116,  114,  113,  112,  110,  108,  107,
    105,  103,  102,  100,  98,  96,  94,  91,
    89,  87,  85,  82,  80,  78,  75,  73,
    70,  67,  65,  62,  59,  57,  54,  51,
    48,  45,  42,  39,  36,  33,  30,  27,
    24,  21,  18,  15,  12,  9,  6,  3,
    0,  -3,  -6,  -9,  -12,  -15,  -18,  -21,
    -24,  -27,  -30,  -33,  -36,  -39,  -42,  -45,
    -48,  -51,  -54,  -57,  -59,  -62,  -65,  -67,
    -70,  -73,  -75,  -78,  -80,  -82,  -85,  -87,
    -89,  -91,  -94,  -96,  -98,  -100,  -102,  -103,
    -105,  -107,  -108,  -110,  -112,  -113,  -114,  -116,
    -117,  -118,  -119,  -120,  -121,  -122,  -123,  -123,
    -124,  -125,  -125,  -126,  -126,  -126,  -126,  -126,
    -126,  -126,  -126,  -126,  -126,  -126,  -125,  -125,
    -124,  -123,  -123,  -122,  -121,  -120,  -119,  -118,
    -117,  -116,  -114,  -113,  -112,  -110,  -108,  -107,
    -105,  -103,  -102,  -100,  -98,  -96,  -94,  -91,
    -89,  -87,  -85,  -82,  -80,  -78,  -75,  -73,
    -70,  -67,  -65,  -62,  -59,  -57,  -54,  -51,
    -48,  -45,  -42,  -39,  -36,  -33,  -30,  -27,
    -24,  -21,  -18,  -15,  -12,  -9,  -6,  -3,
    0,  3,  6,  9,  12,  15,  18,  21,
    24,  27,  30,  33,  36,  39,  42,  45,
    48,  51,  54,  57,  59,  62,  65,  67,
    70,  73,  75,  78,  80,  82,  85,  87,
    89,  91,  94,  96,  98,  100,  102,  103,
    105,  107,  108,  110,  112,  113,  114,  116,
    117,  118,  119,  120,  121,  122,  123,  123,
    124,  125,  125,  126,  126,  126,  126,  126,
};

#endif

#endif


#if defined(FFT_128)

//128点FFT
#define SAMPLE_NUM 128
#define LOG 7 log2(128) = 7
//#define FFT_OUT_MIN 0
//#define FFT_OUT_MAX	255	

//int32_t  FftReal[SAMPLE_NUM];
//int32_t  FftImage[SAMPLE_NUM];
//unsigned char result[128];

//采样存储序列表
unsigned char BRTable[SAMPLE_NUM] ={
0, 64, 32, 96, 16, 80, 48, 112,
8, 72, 40, 104, 24, 88, 56, 120,
4, 68, 36, 100, 20, 84, 52, 116,
12, 76, 44, 108, 28, 92, 60, 124,
2, 66, 34, 98, 18, 82, 50, 114,
10, 74, 42, 106, 26, 90, 58, 122,
6, 70, 38, 102, 22, 86, 54, 118,
14, 78, 46, 110, 30, 94, 62, 126,
1, 65, 33, 97, 17, 81, 49, 113,
9, 73, 41, 105, 25, 89, 57, 121,
5, 69, 37, 101, 21, 85, 53, 117,
13, 77, 45, 109, 29, 93, 61, 125,
3, 67, 35, 99, 19, 83, 51, 115,
11, 75, 43, 107, 27, 91, 59, 123,
7, 71, 39, 103, 23, 87, 55, 119,
15, 79, 47, 111, 31, 95, 63, 127
};

#ifdef USE_FLOAT

double sin_tabb[SAMPLE_NUM] = {
    0.000000,  0.049068,  0.098017,  0.146730,
    0.195090,  0.242980,  0.290285,  0.336890,
    0.382683,  0.427555,  0.471397,  0.514103,
    0.555570,  0.595699,  0.634393,  0.671559,
    0.707107,  0.740951,  0.773010,  0.803208,
    0.831470,  0.857729,  0.881921,  0.903989,
    0.923880,  0.941544,  0.956940,  0.970031,
    0.980785,  0.989177,  0.995185,  0.998795,
    1.000000,  0.998795,  0.995185,  0.989177,
    0.980785,  0.970031,  0.956940,  0.941544,
    0.923880,  0.903989,  0.881921,  0.857729,
    0.831470,  0.803208,  0.773010,  0.740951,
    0.707107,  0.671559,  0.634393,  0.595699,
    0.555570,  0.514103,  0.471397,  0.427555,
    0.382683,  0.336890,  0.290285,  0.242980,
    0.195090,  0.146731,  0.098017,  0.049068,
    0.000000,  -0.049068,  -0.098017,  -0.146730,
    -0.195090,  -0.242980,  -0.290285,  -0.336890,
    -0.382683,  -0.427555,  -0.471397,  -0.514103,
    -0.555570,  -0.595699,  -0.634393,  -0.671559,
    -0.707107,  -0.740951,  -0.773010,  -0.803207,
    -0.831470,  -0.857729,  -0.881921,  -0.903989,
    -0.923880,  -0.941544,  -0.956940,  -0.970031,
    -0.980785,  -0.989176,  -0.995185,  -0.998795,
    -1.000000,  -0.998795,  -0.995185,  -0.989177,
    -0.980785,  -0.970031,  -0.956940,  -0.941544,
    -0.923880,  -0.903989,  -0.881921,  -0.857729,
    -0.831470,  -0.803208,  -0.773011,  -0.740951,
    -0.707107,  -0.671559,  -0.634393,  -0.595699,
    -0.555570,  -0.514103,  -0.471397,  -0.427555,
    -0.382684,  -0.336890,  -0.290285,  -0.242980,
    -0.195090,  -0.146731,  -0.098017,  -0.049068
};

double cos_tabb[SAMPLE_NUM] = {
    1.000000,  0.998795,  0.995185,  0.989177,
    0.980785,  0.970031,  0.956940,  0.941544,
    0.923880,  0.903989,  0.881921,  0.857729,
    0.831470,  0.803208,  0.773010,  0.740951,
    0.707107,  0.671559,  0.634393,  0.595699,
    0.555570,  0.514103,  0.471397,  0.427555,
    0.382683,  0.336890,  0.290285,  0.242980,
    0.195090,  0.146730,  0.098017,  0.049068,
    0.000000,  -0.049068,  -0.098017,  -0.146730,
    -0.195090,  -0.242980,  -0.290285,  -0.336890,
    -0.382683,  -0.427555,  -0.471397,  -0.514103,
    -0.555570,  -0.595699,  -0.634393,  -0.671559,
    -0.707107,  -0.740951,  -0.773010,  -0.803208,
    -0.831470,  -0.857729,  -0.881921,  -0.903989,
    -0.923880,  -0.941544,  -0.956940,  -0.970031,
    -0.980785,  -0.989177,  -0.995185,  -0.998795,
    -1.000000,  -0.998795,  -0.995185,  -0.989177,
    -0.980785,  -0.970031,  -0.956940,  -0.941544,
    -0.923880,  -0.903989,  -0.881921,  -0.857729,
    -0.831470,  -0.803208,  -0.773010,  -0.740951,
    -0.707107,  -0.671559,  -0.634393,  -0.595699,
    -0.555570,  -0.514103,  -0.471397,  -0.427555,
    -0.382684,  -0.336890,  -0.290285,  -0.242980,
    -0.195090,  -0.146731,  -0.098017,  -0.049068,
    -0.000000,  0.049068,  0.098017,  0.146730,
    0.195090,  0.242980,  0.290285,  0.336890,
    0.382683,  0.427555,  0.471397,  0.514103,
    0.555570,  0.595699,  0.634393,  0.671559,
    0.707107,  0.740951,  0.773010,  0.803207,
    0.831470,  0.857729,  0.881921,  0.903989,
    0.923879,  0.941544,  0.956940,  0.970031,
    0.980785,  0.989176,  0.995185,  0.998795
};

#else

char  sin_tabb[SAMPLE_NUM] = {0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102, 
105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 
108, 105, 102, 98, 94, 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, 
-36, -42, -48, -54, -59, -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, 
-123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, 
-98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6
};     

char  cos_tabb[SAMPLE_NUM] = {127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94, 
89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, -36, -42, -48, -54, -59, 
-65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -
126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -89, -85, -80, 
-75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6, 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 
75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126
};

#endif

#endif

#if defined(FFT_16)

//16点FFT
#define SAMPLE_NUM 16
#define LOG 4 log2(128) = 7

//采样存储序列表
uint8 BRTable[SAMPLE_NUM] ={
    0,  8,  4,  12,  
    2,  10,  6,  14,  
    1,  9,  5,  13,  
    3,  11,  7,  15
};

#ifdef USE_FLOAT

double sin_tabb[SAMPLE_NUM] = {

};

double cos_tabb[SAMPLE_NUM] = {

};

#else

char  sin_tabb[SAMPLE_NUM] = {
    0,  48,  89,  117,
    126,  117,  89,  48,
    0,  -48,  -89,  -117,
    -126,  -117,  -89,  -48
};  

char  cos_tabb[SAMPLE_NUM] = {
    127,  117,  89,  48,
    0,  -48,  -89,  -117,
    -126,  -117,  -89,  -48,
    0,  48,  89,  117
};

#endif

#endif

#if defined(FFT_32)

//32点FFT
#define SAMPLE_NUM 32
#define LOG 5 log2(128) = 7

//采样存储序列表
uint8 BRTable[SAMPLE_NUM] ={
   0,  16,  8,  24,
   4,  20,  12,  28,
   2,  18,  10,  26,
   6,  22,  14,  30,
   1,  17,  9,  25,
   5,  21,  13,  29,
   3,  19,  11,  27,
   7,  23,  15,  31,
};

#ifdef USE_FLOAT

double  sin_tabb[SAMPLE_NUM] = {
    0.000000,  0.195090,  0.382683,  0.555570,
0.707107,  0.831470,  0.923880,  0.980785,
1.000000,  0.980785,  0.923880,  0.831470,
0.707107,  0.555570,  0.382683,  0.195090,
0.000000,  -0.195090,  -0.382683,  -0.555570,
-0.707107,  -0.831470,  -0.923880,  -0.980785,
-1.000000,  -0.980785,  -0.923880,  -0.831470,
-0.707107,  -0.555570,  -0.382684,  -0.195090,
};  

double  cos_tabb[SAMPLE_NUM] = {
  1.000000,  0.980785,  0.923880,  0.831470,
0.707107,  0.555570,  0.382683,  0.195090,
0.000000,  -0.195090,  -0.382683,  -0.555570,
-0.707107,  -0.831470,  -0.923880,  -0.980785,
-1.000000,  -0.980785,  -0.923880,  -0.831470,
-0.707107,  -0.555570,  -0.382684,  -0.195090,
-0.000000,  0.195090,  0.382683,  0.555570,
0.707107,  0.831470,  0.923879,  0.980785,

};

#else

char  sin_tabb[SAMPLE_NUM] = {
    0,  24,  48,  70,
    89,  105,  117,  124,
    126,  124,  117,  105,
    89,  70,  48,  24,
    0,  -24,  -48,  -70,
    -89,  -105,  -117,  -124,
    -126,  -124,  -117,  -105,
    -89,  -70,  -48,  -24,
};  

char  cos_tabb[SAMPLE_NUM] = {
   127,  124,  117,  105,
   89,  70,  48,  24,
   0,  -24,  -48,  -70,
   -89,  -105,  -117,  -124,
   -126,  -124,  -117,  -105,
   -89,  -70,  -48,  -24,
   0,  24,  48,  70,
   89,  105,  117,  124,
};

#endif

#endif

#if defined(FFT_64)

    //64点FFT
    #define SAMPLE_NUM 64
    #define LOG 6 log2(64) = 6
    
    //采样存储序列表
    uint8_t BRTable[SAMPLE_NUM] ={
       0,  32,  16,  48,  8,  40,  24,  56,
       4,  36,  20,  52,  12,  44,  28,  60,
       2,  34,  18,  50,  10,  42,  26,  58,
       6,  38,  22,  54,  14,  46,  30,  62,
       1,  33,  17,  49,  9,  41,  25,  57,
       5,  37,  21,  53,  13,  45,  29,  61,
       3,  35,  19,  51,  11,  43,  27,  59,
       7,  39,  23,  55,  15,  47,  31,  63,             
    };
    
    #ifdef USE_FLOAT
    
        double  sin_tabb[SAMPLE_NUM] = {
        0.000000,  0.098017,  0.195090,  0.290285,  0.382683,  0.471397,  0.555570,  0.634393,
        0.707107,  0.773010,  0.831470,  0.881921,  0.923880,  0.956940,  0.980785,  0.995185,
        1.000000,  0.995185,  0.980785,  0.956940,  0.923880,  0.881921,  0.831470,  0.773010,
        0.707107,  0.634393,  0.555570,  0.471397,  0.382683,  0.290285,  0.195090,  0.098017,
        0.000000,  -0.098017,  -0.195090,  -0.290285,  -0.382683,  -0.471397,  -0.555570,  -0.634393,
        -0.707107,  -0.773010,  -0.831470,  -0.881921,  -0.923880,  -0.956940,  -0.980785,  -0.995185,
        -1.000000,  -0.995185,  -0.980785,  -0.956940,  -0.923880,  -0.881921,  -0.831470,  -0.773011,
        -0.707107,  -0.634393,  -0.555570,  -0.471397,  -0.382684,  -0.290285,  -0.195090,  -0.098017,        
        };  
        
        double  cos_tabb[SAMPLE_NUM] = {
          1.000000,  0.995185,  0.980785,  0.956940,  0.923880,  0.881921,  0.831470,  0.773010,
          0.707107,  0.634393,  0.555570,  0.471397,  0.382683,  0.290285,  0.195090,  0.098017,
          0.000000,  -0.098017,  -0.195090,  -0.290285,  -0.382683,  -0.471397,  -0.555570,  -0.634393,
          -0.707107,  -0.773010,  -0.831470,  -0.881921,  -0.923880,  -0.956940,  -0.980785,  -0.995185,
          -1.000000,  -0.995185,  -0.980785,  -0.956940,  -0.923880,  -0.881921,  -0.831470,  -0.773010,
          -0.707107,  -0.634393,  -0.555570,  -0.471397,  -0.382684,  -0.290285,  -0.195090,  -0.098017,
          -0.000000,  0.098017,  0.195090,  0.290285,  0.382683,  0.471397,  0.555570,  0.634393,
          0.707107,  0.773010,  0.831470,  0.881921,  0.923879,  0.956940,  0.980785,  0.995185,
        };
    
    #else
    
        char  sin_tabb[SAMPLE_NUM] = {
            0,  12,  24,  36,  48,  59,  70,  80,
            89,  98,  105,  112,  117,  121,  124,  126,
            126,  126,  124,  121,  117,  112,  105,  98,
            89,  80,  70,  59,  48,  36,  24,  12,
            0,  -12,  -24,  -36,  -48,  -59,  -70,  -80,
            -89,  -98,  -105,  -112,  -117,  -121,  -124,  -126,
            -126,  -126,  -124,  -121,  -117,  -112,  -105,  -98,
            -89,  -80,  -70,  -59,  -48,  -36,  -24,  -12,
        };  
        
        char  cos_tabb[SAMPLE_NUM] = {
           127,  126,  124,  121,  117,  112,  105,  98,
           89,  80,  70,  59,  48,  36,  24,  12,
           0,  -12,  -24,  -36,  -48,  -59,  -70,  -80,
           -89,  -98,  -105,  -112,  -117,  -121,  -124,  -126,
           -126,  -126,  -124,  -121,  -117,  -112,  -105,  -98,
           -89,  -80,  -70,  -59,  -48,  -36,  -24,  -12,
           0,  12,  24,  36,  48,  59,  70,  80,
           89,  98,  105,  112,  117,  121,  124,  126,
        };
    #endif

#endif

// 定点运算的处理,若是浮点
void FFT_V(short_t* arr, short_t* result)
{
    uint32_t  bb, j, k, p;
    long_t TReal, Tiamge;
    long_t ulReal, ulImage;
    long_t  FftReal[SAMPLE_NUM] = {0};
    long_t  FftImage[SAMPLE_NUM] = {0};
    int16_t i;

    for (i = 0; i < SAMPLE_NUM; i++)
    {
        FftReal[BRTable[i]] = arr[i];
        FftImage[i] = 0;
    }

    for (i = 1; i <= LOG; i++)  //共有log2(128) = 7级蝶形运算                       
    {
        bb = 1;
        bb <<= (i - 1); //bb表示蝶形运算中,每个蝶形的两点间距离L                                      
        for (j = 0; j <= bb - 1; j++) //每一级有N/2L = N/2(2的(m-1)次方) = N/2(2的(第几级 - 1)次方组蝶形,每组有2的(m-1)次方个蝶形                           
        {
            p = 1;
            p <<= (LOG - i); // 8 7 
            p = p * j;
            for (k = j; k < SAMPLE_NUM; k = k + 2 * bb)
            { 
                if USE_FLOAT
                {
 // 这个地方是128点时,定义为127,实际使用时需要自己根据N处理一下
                TReal = round((FftReal[k + bb] * cos_tabb[p])*1.0 / 127) + round((FftImage[k + bb] * sin_tabb[p])*1.0 / 127);
                Tiamge = round((FftImage[k + bb] * cos_tabb[p])*1.0 / 127) - round((FftReal[k + bb] * sin_tabb[p])*1.0 / 127);  
                 }
                else      
                {
                TReal = (FftReal[k + bb] * cos_tabb[p] ) + (FftImage[k + bb] * sin_tabb[p]) ;
                Tiamge = (FftImage[k + bb] * cos_tabb[p])  - (FftReal[k + bb] * sin_tabb[p]) ; 
                }    

                FftReal[k + bb] = FftReal[k] - TReal;
                FftImage[k + bb] = FftImage[k] - Tiamge;

                FftReal[k] = FftReal[k] + TReal;
                FftImage[k] = FftImage[k] + Tiamge;                  
                         
            }
        }
    }

 
    for (i = 0; i < SAMPLE_NUM; i++)
    {
        ulReal = FftReal[i] * FftReal[i];
        ulImage = FftImage[i] * FftImage[i];
         
        result[i] = sqrt(ulReal + ulImage);
    }

    return;
}

以上代码128点的都已经验证,定点型已应用到产品,整理的仓促,防止以后用的时候再次研究。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚努力的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值