使用查表法计算快速傅里叶变换会快一些,本文采用了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点的都已经验证,定点型已应用到产品,整理的仓促,防止以后用的时候再次研究。