工具/软件:TI C/C++编译器
我正在尝试在 Tiva Launchpad 上实施 fix_FFT 算法,最具体的是 Tom Roberts 提供的 fix_FFTR,但我无法获得正确的输出... 请参阅下面的代码
#include // #include #include // #include include "inc/hw_memmap.h"// #include "driverlib/debug.h" #include "driverlib/pin_map.h"/#include "driverlib/rom.h" #include "driverlib/sysctl.h"/#include "driverlib/pin_map.h" #include "driverlib/trlm/#driverlib/#include "包含"driverh/#driverc/#driverlib/#包含"mc/#driver.h/#driverlib/#driverlib/#driverlib/#包含"drivers/#driver.h/#driverc/#driverlib/#包含"driverlib/#drivers/#driverlib/#driver.h" 寄存器定义//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define GPIO_PORTF_DATA_R (*(volatile unsigned long *) 0x400253FC) #define GPIO_PORTF_DIR_R (*(volatile unsigned long *) 0x40025400) #define GPIO_PORTF_AFSEL_R (*(volatile unsigned long *) 0x40025420) #define GPIO_PORTF_PUR_R (*(volatile unsigned long *) 0x40025510) #define GPIO_PORTF_DEN_R (*(volatile unsigned long *) 0x4002551C) #define GPIO_PORTF_LOCK_R (*(volatile unsigned long *) 0x40025520) #define GPIO_PORTF_CR_R (*(volatile unsigned long *) 0x40025524) #define GPIO_PORTF_AMSEL_R (*(volatile unsigned long *) 0x40025528) #define GPIO_PORTF_PCTL_R (*(volatile unsigned long *) 0x4002552C) #define SYSCTL_RCGC2_R (*(volatile unsigned long *) 0x400FE108) #define GPIO_PORTF_PDR_R (*(volatile unsigned long *) 0x40025514)//////////////////////////// #define GPIO_PORta_AMSEL_R (*(volatile unsigned long *) 0x40004528) #define GPIO_Porta_PCTL_R (*(volatile unsigned long *) 0x4000452C) #define GPIO_PORta_DIR_R (*(volatile unsigned long *) 0x40004400) #define GPIO_PORta_AFSEL_R (*(volatile unsigned long *) 0x40004420) )#define GPIO_Porta_DEN_R (*(volatile unsigned long *) 0x4000451C)) )////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////// #define true 1 #define false 0 #define GPIO_PORTF_LOCK_R (*(volatile unsigned long *) 0x40025520) )/* void PWM_RGB_Init (void); void ADC0_Init (void); void UnlockPortF (void); unsigned int ADC_CH0_Sample (void); //enum color{red、blue、green}; unsigned int Green_ColorTempConvert (unsigned int ADCValue); unsigned int Blue_ColorTempConvert (unsigned int ADCValue); unsigned int OnTimes (unsigned int* reedAddress、unsigned int* blueAddress、unsigned int* GreenAddress);unsigned int Pushbutton_Init (unsigned int ADC281);void processOnTimes (unsigned int、unsigned InT 、9990、9090、5980、5980、9090、5980、9090、5a、9090、9090、5a、5a、5a、9082、5a、5101、9090、9090、5a、9090、5a、5a、9090、9090、580、9090、580、9080、9090、9090、580、9090、5a、9080、9090、9090、5a、580、9090、9090、580、580、9090、9090、580、9090、580、9090 短余弦22[128]={1000,809,309,-810,-1000,-810,-310,809,309,-310,-810,-1000,-810,-810,-310,809,309,-310,-1000,10-310,809,810,310,309,810,809,810,809,810,310-310,809,810,809,810,809,810,310,309,810,809,810 ^, volatile long max=0; volatile int maxIndex=0; for (i=0;i<64;i++){ //捕获功率^2. FFT_POWER[i]=((long) cosine22[i]*(long) cosine22[i])+((long) cosine22[i+64]*(long) cosine22[i+64]); //捕获最大值 if (FFT_POWER[I]>max){ Max=FFT_POWER[i]; maxIndex=I; } } 返回(0); }
我对 FIX_FFTR 的理解是、它作为参数是:
1、大小为 N 的数组(在我的案例中为128)
2、"m"因子、在我的例子中就是 log2 (N)
3.告知函数我是要正向还是反向 FFT 的标志,在我的情况下应该为0。
它只是将您输入的数组替换为包含 N/2实数元素(索引0到 N/2-1) l 和 N/2虚数元素(索引 N/2到 N)的数组。
我首先插入一个余弦函数、并尝试在所选频率处恢复一个尖峰。 我的采样频率为220Hz、我尝试捕获的波的频率为22Hz。 然后、我尝试在每个频率单元中捕获相对功率(我知道您应该为 sqrt 表示真正功率、但我跳过了该部分、请诉我)。 根据我在采样频率为1/10的时域中的输入、可以预期 N/10in 具有最大的峰值。 但是、当我在调试中运行并检查我的数字时、我得到的结果与我们在不同位置使用奇怪的尖峰时所期望的结果大相径庭:
FFT_POWER | 长[64] | [245、340、629、130、3152。。。] | 0x20000918 | ||
0 | 0 | [0] | 长 | 245. | 0x20000918 |
1.71875 | 1 | [1] | 长 | 340 | 0x2000091C |
3.4375 | 2. | [2] | 长 | 629 | 0x20000920 |
5.15625 | 3. | [3] | 长 | 1305 | 0x20000924 |
6.875 | 4. | [4] | 长 | 3152. | 0x20000928 |
8.59375 | 5. | [5] | 长 | 10937 | 0x2000092C |
10.3125. | 6. | [6] | 长 | 148733 | 0x20000930 |
12.03125 | 7. | [7] | 长 | 75065 | 0x20000934 |
13.75 | 8. | [8] | 长 | 11545. | 0x20000938 |
15.46875 | 9. | [9] | 长 | 4930. | 0x2000093C |
17.1875 | 10. | [10] | 长 | 2842. | 0x20000940 |
18.90625 | 11. | [11] | 长 | 1961年 | 0x20000944 |
20.625 | 12. | [12] | 长 | 1489 | 0x20000948 |
22.34375 | 13. | [13] | 长 | 1145. | 0x2000094C |
24.0625. | 14. | [14] | 长 | 976 | 0x20000950 |
25.78125. | 15. | [15] | 长 | 800 | 0x20000954 |
27.5. | 16. | [16] | 长 | 730 | 0x20000958 |
29.21875 | 17. | [17] | 长 | 637) | 0x2000095C |
30.9375 | 18 | [18] | 长 | 629 | 0x20000960 |
32.65625 | 19. | [19] | 长 | 640) | 0x20000964 |
34.375 | 20. | [20] | 长 | 692. | 0x20000968 |
36.09375 | 21. | [21] | 长 | 738) | 0x2000096C |
37.8125 | 22. | [22] | 长 | 905 | 0x20000970 |
39.53125 | 23 | [23] | 长 | 1573. | 0x20000974 |
41.25. | 24 | [24] | 长 | 4045. | 0x20000978 |
42.96875 | 25 | [25] | 长 | 30920 | 0x2000097C |
44.6875 | 26 | [26] | 长 | 84825. | 0x20000980 |
46.40625 | 27. | [27] | 长 | 9010. | 0x20000984 |
48.125. | 28. | [28] | 长 | 4505 | 0x20000988 |
49.84375 | 29. | [29] | 长 | 3016 | 0x2000098C |
51.5625 | 30 | [30] | 长 | 2740. | 0x20000990 |
53.28125 | 31. | [31] | 长 | 2610. | 0x20000994 |
55 | 32 | [32] | 长 | 2809. | 0x20000998 |
56.71875 | 33. | [33] | 长 | 3280 | 0x2000099C |
58.4375 | 34 | [34] | 长 | 4285. | 0x200009A0 |
60.15625 | 35. | [35] | 长 | 6185. | 0x200009A4 |
61.875 | 36. | [36] | 长 | 10916 | 0x200009A8 |
63.59375 | 37. | [37] | 长 | 28561 | 0x200009AC |
65.3125. | 38. | [38] | 长 | 309905 | 0x200009B0 |
67.03125 | 39. | [39] | 长 | 124577 | 0x200009B4 |
68.75 | 40 | [40] | 长 | 15925 | 0x200009B8. |
70.46875 | 41. | [41] | 长 | 5186 | 0x200009BC |
72.1875 | 42. | [42] | 长 | 2578 | 0x200009C0 |
73.90625 | 43. | [43] | 长 | 1417. | 0x200009C4 |
75.625. | 44. | [44] | 长 | 929. | 0x200009C8 |
77.34375 | 45. | [45] | 长 | 569. | 0x200009CC |
79.0625. | 46. | [46] | 长 | 464.64 | 0x200009D0 |
80.78125 | 47. | [47] | 长 | 340 | 0x200009D4 |
82.5 | 48 | [48] | 长 | 290 | 0x200009D8 |
84.21875 | 49 | [49] | 长 | 265 | 0x200009DC |
85.9375. | 50 | [50] | 长 | 305. | 0x200009E0 |
87.65625 | 51. | [51] | 长 | 296. | 0x200009E4 |
89.375. | 52. | [52] | 长 | 288 | 0x200009E8. |
91.09375 | 53. | [53] | 长 | 458 | 0x200009EC |
92.8125 | 54 | [54] | 长 | 745-45 | 0x200009F0 |
94.53125 | 55 | [55] | 长 | 1233. | 0x200009F4 |
96.25. | 56. | [56] | 长 | 2929. | 0x200009F8 |
97.96875 | 57. | [57] | 长 | 19172. | 0x200009FC |
99.6875 | 58. | [58] | 长 | 39145. | 0x20000A00 |
101.40625 | 59. | [59] | 长 | 2858. | 0x20000A04 |
103.125. | 60 | [60] | 长 | 809) | 0x20000A08 |
104.84375 | 61. | [61] | 长 | 360度 | 0x20000A0C |
106.5625. | 62. | [62] | 长 | 180 | 0x20000A10 |
108.28125. | 63. | [63] | 长 | 202. | 0x20000A14 |
不用说、我现在有点被骗了。 如果有人对 FFTR 或我所犯的错误有任何建议、我会很感激。
谢谢、
Jim