当前位置:   article > 正文

[DSP学习笔记]基于TMS320F28335的FFT及加窗函数实现_ref_rfft_f32

ref_rfft_f32

一、新建工程

首先我们先将C2000 wave中我们所需要的函数库给导入到我们的新建工程中(可见于我实现FIR滤波文章中导入函数库的操作)。

工程中可见有以下文件。(仅FFT可删除滤波有关文件)

接着新建我们所需的文件INPUT.c于Window.c。

二、输入信号 

借助MATLAB我们来生成所需的输入信号于窗函数

生成输入信号的MATLAB程序如下:

  1. %生成固定点数固定频率的正弦信号
  2. %fs为采样率
  3. %f为多频信号频率
  4. %N为采样点数
  5. %amp为信号幅值
  6. %phase为信号初相位
  7. function [input,t] = mult_freq_signal_test(fs,f,N,amp,phase)
  8. dt = 1/fs; %采样周期
  9. t = dt*N; %采样时间
  10. temp = (0:dt:(N-1)*dt)';
  11. y = amp.*sin(2*pi*f.*temp+phase/180*pi);
  12. Num = size(f,2); %获取f频率个数
  13. input = y*ones(Num,1);
  14. subplot(1,2,1);
  15. plot(temp/dt,input);
  16. title('信号时域');
  17. xlabel('点数 N');ylabel('幅值 A');
  18. subplot(1,2,2);
  19. Y = fftshift(fft(input));%做傅里叶变换并把零频点移到频谱中心
  20. F = (-N/2:N/2-1)*(fs/N);%设置横坐标
  21. plot(F,abs(Y)/max(abs(Y)));
  22. title('信号频域');
  23. xlabel('频率 f');ylabel('幅值 A')
  24. end
  1. %与mult_freq_signal_test.m函数式文件配合使用,将生成的输出信号保存到本地
  2. fs=8e4; %设采样率为80K
  3. f = [1e4,1.5e4,3e4]; %频率矩阵(1*N)测试信号频率为10K,15K,30K
  4. phase = [20,0,40]; %初相位分别为为20040
  5. amp = [0.5/3*4095,0.3/3*4095,0.4/3*4095];%对应幅值为0.5V,0.3V,0.4V信号的采集值(ADC为0-3V)
  6. N=1024; %采样点数
  7. y=mult_freq_signal_test(fs,f,N,amp,phase);
  8. y=reshape(y,[4,N/4]);
  9. y=y+1.2/3*4095; %用于增加直流偏置,无需直流偏置时可注释,直流偏置为1V
  10. y=y';
  11. %writematrix(y,'record.txt','delimiter',',');%将生成的初始信号保存到.m文件路径下的record.txt
  12. fileID = fopen('record.txt','w');
  13. for i=1:1:N/4
  14. fprintf(fileID,'%.6f,%.6f,%.6f,%.6f,\n',y(i,1),y(i,2),y(i,3),y(i,4));
  15. end
  16. fclose(fileID);%将生成的初始信号保存到.m文件路径下的record.txt

将record.txt的文件内容复制到INPUT.c中,如下:

  1. //#############################################################################
  2. //! \file input.c
  3. //! \brief Input Vector (2048)
  4. //! \author Vishal Coelho
  5. //! \date 19-Jan-2023
  6. //!
  7. //
  8. // Group: C2000
  9. // Target Family: $DEVICE$
  10. //
  11. //#############################################################################
  12. //
  13. //
  14. // $Copyright: Copyright (C) 2020 Texas Instruments Incorporated -
  15. // http://www.ti.com/ ALL RIGHTS RESERVED $
  16. //#############################################################################
  17. #include <stdint.h>
  18. #pragma DATA_SECTION(FFT_input, "FFT_buffer3")
  19. // Matrix is 2 times its required sizeas it will be used to store
  20. // 1024 floats at a later point
  21. uint16_t FFT_input[2048] = {
  22. 2222.390783,2682.470769,2150.640175,2313.650403,
  23. 644.109217,815.149034,1704.480279,1183.969400,
  24. 2222.390783,1925.813432,1571.519721,2627.068134,
  25. 1463.109217,1128.566765,1125.359825,427.312063,
  26. 2222.390783,2682.470769,2150.640175,2313.650403,
  27. 644.109217,815.149034,1704.480279,1183.969400,
  28. 2222.390783,1925.813432,1571.519721,2627.068134,
  29. 1463.109217,1128.566765,1125.359825,427.312063,
  30. 2222.390783,2682.470769,2150.640175,2313.650403,
  31. 644.109217,815.149034,1704.480279,1183.969400,
  32. 2222.390783,1925.813432,1571.519721,2627.068134,
  33. 1463.109217,1128.566765,1125.359825,427.312063,
  34. 2222.390783,2682.470769,2150.640175,2313.650403,
  35. 644.109217,815.149034,1704.480279,1183.969400,
  36. 2222.390783,1925.813432,1571.519721,2627.068134,
  37. 1463.109217,1128.566765,1125.359825,427.312063,
  38. 2222.390783,2682.470769,2150.640175,2313.650403,
  39. 644.109217,815.149034,1704.480279,1183.969400,
  40. 2222.390783,1925.813432,1571.519721,2627.068134,
  41. 1463.109217,1128.566765,1125.359825,427.312063,
  42. 2222.390783,2682.470769,2150.640175,2313.650403,
  43. 644.109217,815.149034,1704.480279,1183.969400,
  44. 2222.390783,1925.813432,1571.519721,2627.068134,
  45. 1463.109217,1128.566765,1125.359825,427.312063,
  46. 2222.390783,2682.470769,2150.640175,2313.650403,
  47. 644.109217,815.149034,1704.480279,1183.969400,
  48. 2222.390783,1925.813432,1571.519721,2627.068134,
  49. 1463.109217,1128.566765,1125.359825,427.312063,
  50. 2222.390783,2682.470769,2150.640175,2313.650403,
  51. 644.109217,815.149034,1704.480279,1183.969400,
  52. 2222.390783,1925.813432,1571.519721,2627.068134,
  53. 1463.109217,1128.566765,1125.359825,427.312063,
  54. 2222.390783,2682.470769,2150.640175,2313.650403,
  55. 644.109217,815.149034,1704.480279,1183.969400,
  56. 2222.390783,1925.813432,1571.519721,2627.068134,
  57. 1463.109217,1128.566765,1125.359825,427.312063,
  58. 2222.390783,2682.470769,2150.640175,2313.650403,
  59. 644.109217,815.149034,1704.480279,1183.969400,
  60. 2222.390783,1925.813432,1571.519721,2627.068134,
  61. 1463.109217,1128.566765,1125.359825,427.312063,
  62. 2222.390783,2682.470769,2150.640175,2313.650403,
  63. 644.109217,815.149034,1704.480279,1183.969400,
  64. 2222.390783,1925.813432,1571.519721,2627.068134,
  65. 1463.109217,1128.566765,1125.359825,427.312063,
  66. 2222.390783,2682.470769,2150.640175,2313.650403,
  67. 644.109217,815.149034,1704.480279,1183.969400,
  68. 2222.390783,1925.813432,1571.519721,2627.068134,
  69. 1463.109217,1128.566765,1125.359825,427.312063,
  70. 2222.390783,2682.470769,2150.640175,2313.650403,
  71. 644.109217,815.149034,1704.480279,1183.969400,
  72. 2222.390783,1925.813432,1571.519721,2627.068134,
  73. 1463.109217,1128.566765,1125.359825,427.312063,
  74. 2222.390783,2682.470769,2150.640175,2313.650403,
  75. 644.109217,815.149034,1704.480279,1183.969400,
  76. 2222.390783,1925.813432,1571.519721,2627.068134,
  77. 1463.109217,1128.566765,1125.359825,427.312063,
  78. 2222.390783,2682.470769,2150.640175,2313.650403,
  79. 644.109217,815.149034,1704.480279,1183.969400,
  80. 2222.390783,1925.813432,1571.519721,2627.068134,
  81. 1463.109217,1128.566765,1125.359825,427.312063,
  82. 2222.390783,2682.470769,2150.640175,2313.650403,
  83. 644.109217,815.149034,1704.480279,1183.969400,
  84. 2222.390783,1925.813432,1571.519721,2627.068134,
  85. 1463.109217,1128.566765,1125.359825,427.312063,
  86. 2222.390783,2682.470769,2150.640175,2313.650403,
  87. 644.109217,815.149034,1704.480279,1183.969400,
  88. 2222.390783,1925.813432,1571.519721,2627.068134,
  89. 1463.109217,1128.566765,1125.359825,427.312063,
  90. 2222.390783,2682.470769,2150.640175,2313.650403,
  91. 644.109217,815.149034,1704.480279,1183.969400,
  92. 2222.390783,1925.813432,1571.519721,2627.068134,
  93. 1463.109217,1128.566765,1125.359825,427.312063,
  94. 2222.390783,2682.470769,2150.640175,2313.650403,
  95. 644.109217,815.149034,1704.480279,1183.969400,
  96. 2222.390783,1925.813432,1571.519721,2627.068134,
  97. 1463.109217,1128.566765,1125.359825,427.312063,
  98. 2222.390783,2682.470769,2150.640175,2313.650403,
  99. 644.109217,815.149034,1704.480279,1183.969400,
  100. 2222.390783,1925.813432,1571.519721,2627.068134,
  101. 1463.109217,1128.566765,1125.359825,427.312063,
  102. 2222.390783,2682.470769,2150.640175,2313.650403,
  103. 644.109217,815.149034,1704.480279,1183.969400,
  104. 2222.390783,1925.813432,1571.519721,2627.068134,
  105. 1463.109217,1128.566765,1125.359825,427.312063,
  106. 2222.390783,2682.470769,2150.640175,2313.650403,
  107. 644.109217,815.149034,1704.480279,1183.969400,
  108. 2222.390783,1925.813432,1571.519721,2627.068134,
  109. 1463.109217,1128.566765,1125.359825,427.312063,
  110. 2222.390783,2682.470769,2150.640175,2313.650403,
  111. 644.109217,815.149034,1704.480279,1183.969400,
  112. 2222.390783,1925.813432,1571.519721,2627.068134,
  113. 1463.109217,1128.566765,1125.359825,427.312063,
  114. 2222.390783,2682.470769,2150.640175,2313.650403,
  115. 644.109217,815.149034,1704.480279,1183.969400,
  116. 2222.390783,1925.813432,1571.519721,2627.068134,
  117. 1463.109217,1128.566765,1125.359825,427.312063,
  118. 2222.390783,2682.470769,2150.640175,2313.650403,
  119. 644.109217,815.149034,1704.480279,1183.969400,
  120. 2222.390783,1925.813432,1571.519721,2627.068134,
  121. 1463.109217,1128.566765,1125.359825,427.312063,
  122. 2222.390783,2682.470769,2150.640175,2313.650403,
  123. 644.109217,815.149034,1704.480279,1183.969400,
  124. 2222.390783,1925.813432,1571.519721,2627.068134,
  125. 1463.109217,1128.566765,1125.359825,427.312063,
  126. 2222.390783,2682.470769,2150.640175,2313.650403,
  127. 644.109217,815.149034,1704.480279,1183.969400,
  128. 2222.390783,1925.813432,1571.519721,2627.068134,
  129. 1463.109217,1128.566765,1125.359825,427.312063,
  130. 2222.390783,2682.470769,2150.640175,2313.650403,
  131. 644.109217,815.149034,1704.480279,1183.969400,
  132. 2222.390783,1925.813432,1571.519721,2627.068134,
  133. 1463.109217,1128.566765,1125.359825,427.312063,
  134. 2222.390783,2682.470769,2150.640175,2313.650403,
  135. 644.109217,815.149034,1704.480279,1183.969400,
  136. 2222.390783,1925.813432,1571.519721,2627.068134,
  137. 1463.109217,1128.566765,1125.359825,427.312063,
  138. 2222.390783,2682.470769,2150.640175,2313.650403,
  139. 644.109217,815.149034,1704.480279,1183.969400,
  140. 2222.390783,1925.813432,1571.519721,2627.068134,
  141. 1463.109217,1128.566765,1125.359825,427.312063,
  142. 2222.390783,2682.470769,2150.640175,2313.650403,
  143. 644.109217,815.149034,1704.480279,1183.969400,
  144. 2222.390783,1925.813432,1571.519721,2627.068134,
  145. 1463.109217,1128.566765,1125.359825,427.312063,
  146. 2222.390783,2682.470769,2150.640175,2313.650403,
  147. 644.109217,815.149034,1704.480279,1183.969400,
  148. 2222.390783,1925.813432,1571.519721,2627.068134,
  149. 1463.109217,1128.566765,1125.359825,427.312063,
  150. 2222.390783,2682.470769,2150.640175,2313.650403,
  151. 644.109217,815.149034,1704.480279,1183.969400,
  152. 2222.390783,1925.813432,1571.519721,2627.068134,
  153. 1463.109217,1128.566765,1125.359825,427.312063,
  154. 2222.390783,2682.470769,2150.640175,2313.650403,
  155. 644.109217,815.149034,1704.480279,1183.969400,
  156. 2222.390783,1925.813432,1571.519721,2627.068134,
  157. 1463.109217,1128.566765,1125.359825,427.312063,
  158. 2222.390783,2682.470769,2150.640175,2313.650403,
  159. 644.109217,815.149034,1704.480279,1183.969400,
  160. 2222.390783,1925.813432,1571.519721,2627.068134,
  161. 1463.109217,1128.566765,1125.359825,427.312063,
  162. 2222.390783,2682.470769,2150.640175,2313.650403,
  163. 644.109217,815.149034,1704.480279,1183.969400,
  164. 2222.390783,1925.813432,1571.519721,2627.068134,
  165. 1463.109217,1128.566765,1125.359825,427.312063,
  166. 2222.390783,2682.470769,2150.640175,2313.650403,
  167. 644.109217,815.149034,1704.480279,1183.969400,
  168. 2222.390783,1925.813432,1571.519721,2627.068134,
  169. 1463.109217,1128.566765,1125.359825,427.312063,
  170. 2222.390783,2682.470769,2150.640175,2313.650403,
  171. 644.109217,815.149034,1704.480279,1183.969400,
  172. 2222.390783,1925.813432,1571.519721,2627.068134,
  173. 1463.109217,1128.566765,1125.359825,427.312063,
  174. 2222.390783,2682.470769,2150.640175,2313.650403,
  175. 644.109217,815.149034,1704.480279,1183.969400,
  176. 2222.390783,1925.813432,1571.519721,2627.068134,
  177. 1463.109217,1128.566765,1125.359825,427.312063,
  178. 2222.390783,2682.470769,2150.640175,2313.650403,
  179. 644.109217,815.149034,1704.480279,1183.969400,
  180. 2222.390783,1925.813432,1571.519721,2627.068134,
  181. 1463.109217,1128.566765,1125.359825,427.312063,
  182. 2222.390783,2682.470769,2150.640175,2313.650403,
  183. 644.109217,815.149034,1704.480279,1183.969400,
  184. 2222.390783,1925.813432,1571.519721,2627.068134,
  185. 1463.109217,1128.566765,1125.359825,427.312063,
  186. 2222.390783,2682.470769,2150.640175,2313.650403,
  187. 644.109217,815.149034,1704.480279,1183.969400,
  188. 2222.390783,1925.813432,1571.519721,2627.068134,
  189. 1463.109217,1128.566765,1125.359825,427.312063,
  190. 2222.390783,2682.470769,2150.640175,2313.650403,
  191. 644.109217,815.149034,1704.480279,1183.969400,
  192. 2222.390783,1925.813432,1571.519721,2627.068134,
  193. 1463.109217,1128.566765,1125.359825,427.312063,
  194. 2222.390783,2682.470769,2150.640175,2313.650403,
  195. 644.109217,815.149034,1704.480279,1183.969400,
  196. 2222.390783,1925.813432,1571.519721,2627.068134,
  197. 1463.109217,1128.566765,1125.359825,427.312063,
  198. 2222.390783,2682.470769,2150.640175,2313.650403,
  199. 644.109217,815.149034,1704.480279,1183.969400,
  200. 2222.390783,1925.813432,1571.519721,2627.068134,
  201. 1463.109217,1128.566765,1125.359825,427.312063,
  202. 2222.390783,2682.470769,2150.640175,2313.650403,
  203. 644.109217,815.149034,1704.480279,1183.969400,
  204. 2222.390783,1925.813432,1571.519721,2627.068134,
  205. 1463.109217,1128.566765,1125.359825,427.312063,
  206. 2222.390783,2682.470769,2150.640175,2313.650403,
  207. 644.109217,815.149034,1704.480279,1183.969400,
  208. 2222.390783,1925.813432,1571.519721,2627.068134,
  209. 1463.109217,1128.566765,1125.359825,427.312063,
  210. 2222.390783,2682.470769,2150.640175,2313.650403,
  211. 644.109217,815.149034,1704.480279,1183.969400,
  212. 2222.390783,1925.813432,1571.519721,2627.068134,
  213. 1463.109217,1128.566765,1125.359825,427.312063,
  214. 2222.390783,2682.470769,2150.640175,2313.650403,
  215. 644.109217,815.149034,1704.480279,1183.969400,
  216. 2222.390783,1925.813432,1571.519721,2627.068134,
  217. 1463.109217,1128.566765,1125.359825,427.312063,
  218. 2222.390783,2682.470769,2150.640175,2313.650403,
  219. 644.109217,815.149034,1704.480279,1183.969400,
  220. 2222.390783,1925.813432,1571.519721,2627.068134,
  221. 1463.109217,1128.566765,1125.359825,427.312063,
  222. 2222.390783,2682.470769,2150.640175,2313.650403,
  223. 644.109217,815.149034,1704.480279,1183.969400,
  224. 2222.390783,1925.813432,1571.519721,2627.068134,
  225. 1463.109217,1128.566765,1125.359825,427.312063,
  226. 2222.390783,2682.470769,2150.640175,2313.650403,
  227. 644.109217,815.149034,1704.480279,1183.969400,
  228. 2222.390783,1925.813432,1571.519721,2627.068134,
  229. 1463.109217,1128.566765,1125.359825,427.312063,
  230. 2222.390783,2682.470769,2150.640175,2313.650403,
  231. 644.109217,815.149034,1704.480279,1183.969400,
  232. 2222.390783,1925.813432,1571.519721,2627.068134,
  233. 1463.109217,1128.566765,1125.359825,427.312063,
  234. 2222.390783,2682.470769,2150.640175,2313.650403,
  235. 644.109217,815.149034,1704.480279,1183.969400,
  236. 2222.390783,1925.813432,1571.519721,2627.068134,
  237. 1463.109217,1128.566765,1125.359825,427.312063,
  238. 2222.390783,2682.470769,2150.640175,2313.650403,
  239. 644.109217,815.149034,1704.480279,1183.969400,
  240. 2222.390783,1925.813432,1571.519721,2627.068134,
  241. 1463.109217,1128.566765,1125.359825,427.312063,
  242. 2222.390783,2682.470769,2150.640175,2313.650403,
  243. 644.109217,815.149034,1704.480279,1183.969400,
  244. 2222.390783,1925.813432,1571.519721,2627.068134,
  245. 1463.109217,1128.566765,1125.359825,427.312063,
  246. 2222.390783,2682.470769,2150.640175,2313.650403,
  247. 644.109217,815.149034,1704.480279,1183.969400,
  248. 2222.390783,1925.813432,1571.519721,2627.068134,
  249. 1463.109217,1128.566765,1125.359825,427.312063,
  250. 2222.390783,2682.470769,2150.640175,2313.650403,
  251. 644.109217,815.149034,1704.480279,1183.969400,
  252. 2222.390783,1925.813432,1571.519721,2627.068134,
  253. 1463.109217,1128.566765,1125.359825,427.312063,
  254. 2222.390783,2682.470769,2150.640175,2313.650403,
  255. 644.109217,815.149034,1704.480279,1183.969400,
  256. 2222.390783,1925.813432,1571.519721,2627.068134,
  257. 1463.109217,1128.566765,1125.359825,427.312063,
  258. 2222.390783,2682.470769,2150.640175,2313.650403,
  259. 644.109217,815.149034,1704.480279,1183.969400,
  260. 2222.390783,1925.813432,1571.519721,2627.068134,
  261. 1463.109217,1128.566765,1125.359825,427.312063,
  262. 2222.390783,2682.470769,2150.640175,2313.650403,
  263. 644.109217,815.149034,1704.480279,1183.969400,
  264. 2222.390783,1925.813432,1571.519721,2627.068134,
  265. 1463.109217,1128.566765,1125.359825,427.312063,
  266. 2222.390783,2682.470769,2150.640175,2313.650403,
  267. 644.109217,815.149034,1704.480279,1183.969400,
  268. 2222.390783,1925.813432,1571.519721,2627.068134,
  269. 1463.109217,1128.566765,1125.359825,427.312063,
  270. 2222.390783,2682.470769,2150.640175,2313.650403,
  271. 644.109217,815.149034,1704.480279,1183.969400,
  272. 2222.390783,1925.813432,1571.519721,2627.068134,
  273. 1463.109217,1128.566765,1125.359825,427.312063,
  274. 2222.390783,2682.470769,2150.640175,2313.650403,
  275. 644.109217,815.149034,1704.480279,1183.969400,
  276. 2222.390783,1925.813432,1571.519721,2627.068134,
  277. 1463.109217,1128.566765,1125.359825,427.312063,
  278. };
  279. // End of File

三、窗函数

接下我们进行窗函数的生成。

1.加窗之前,首先我们要明白我们为什么要加窗。

在实际应用中,我们采集到的信号通常是较长的非周期时间序列,在进行FFT时,需要对信号进行截断。截断后得到的信号通常是非周期信号,所以FFT结果就变成了连续的谱线,周期信号的频率-幅值不再是一条垂直的直线,而是一条曲线,同时幅值下降,泄露到曲线其他频率点,即我们常说的频谱泄露。而窗函数一个周期函数,窗函数与截断信号相乘后,会变成比较接近周期函数的波形(实际上就是利用窗函数进行调制)。加窗后的信号进行FFT后,得到的频谱曲线会更窄,趋向于垂直直线。因此对频谱泄露有一定改善。

2.知道为什么要加窗后,我们再来根据实际情况来选择我们所需要的窗函数。

通常情况下,我们不对输入信号进行处理,而直接截断情况下相当于给信号加了一个矩形窗。

如果我们对于FFT后的结果要求精确的幅值,平顶窗是我们的首选。

如果我们对应FFT后的结果要求精确的频率点,则可以选择汉宁窗。

如果检测两个频率相近、幅度不同的信号,可以选用布莱克曼窗。

如果对应频率于幅值均有一定要求,则可以选用凯赛窗。

3.选择完窗函数,我们还要对FFT后的结果乘以他们对应的恢复系数(窗函数对信号有衰减),如下表:

 了解完以上知识,我们便可以继续我们的实验。

在MATLAB命令行窗口敲入window,进入下列界面并完成下列配置。(本次测试选用汉宁窗)

点击文件,导出

导出到工作区,我使用默认的变量名。我们便在工作区得到了从我们所需要的窗函数。

 但是,我们工程实际应用,还需对得到的窗函数进行处理,将其转化为Q16型。

官方例程中提出,如下

通过编写MATLAB文件实现,并保存到本地的window.txt文件中。

  1. %将窗设计器生成的窗系数打印到window.txt文件中
  2. fileID = fopen('window.txt','w');
  3. N=1024;%生成窗点数
  4. Win=reshape(Win',N,1);
  5. Windows=uint16(floor(Win.*(2^16))); % convert to Q16
  6. Windows=reshape(Windows,[4,N/4]);
  7. Windows=Windows';
  8. for i=1:1:N/8
  9. fprintf(fileID,'%d,%d,%d,%d,\n',Windows(i,1),Windows(i,2),Windows(i,3),Windows(i,4));
  10. end
  11. fclose(fileID);%将生成的初始信号保存到.m文件路径下的window.txt

 将window.txt的内容复制到window.c中,如下:

  1. //#############################################################################
  2. //! \file window.c
  3. //! \brief window Vector (512)
  4. //! \author yang
  5. //! \date 19-Jan-2023
  6. //! 此窗函数为汉宁窗,由MATLAB生成,加窗后FFT结果需乘以恢复系数,汉宁窗恢复系数为2
  7. //
  8. // Group: C2000
  9. // Target Family: $DEVICE$
  10. //
  11. //#############################################################################
  12. #include "dsp.h"
  13. const uint16_t Window[512]={
  14. 0,0,2,5,
  15. 9,15,22,30,
  16. 39,50,61,74,
  17. 88,104,121,138,
  18. 158,178,200,222,
  19. 246,272,298,326,
  20. 355,385,416,449,
  21. 483,518,554,592,
  22. 630,670,711,754,
  23. 797,842,888,935,
  24. 983,1033,1084,1136,
  25. 1189,1243,1299,1355,
  26. 1413,1472,1533,1594,
  27. 1657,1720,1785,1851,
  28. 1919,1987,2057,2128,
  29. 2199,2273,2347,2422,
  30. 2499,2576,2655,2735,
  31. 2816,2898,2982,3066,
  32. 3152,3238,3326,3415,
  33. 3505,3596,3688,3782,
  34. 3876,3972,4068,4166,
  35. 4265,4364,4465,4567,
  36. 4670,4774,4880,4986,
  37. 5093,5201,5311,5421,
  38. 5532,5645,5758,5873,
  39. 5988,6105,6222,6341,
  40. 6460,6581,6702,6825,
  41. 6948,7072,7198,7324,
  42. 7451,7580,7709,7839,
  43. 7970,8102,8235,8369,
  44. 8504,8640,8776,8914,
  45. 9052,9192,9332,9473,
  46. 9615,9758,9901,10046,
  47. 10191,10338,10485,10633,
  48. 10782,10931,11082,11233,
  49. 11385,11538,11692,11846,
  50. 12002,12158,12315,12472,
  51. 12631,12790,12950,13110,
  52. 13272,13434,13597,13760,
  53. 13924,14090,14255,14422,
  54. 14589,14757,14925,15094,
  55. 15264,15434,15606,15777,
  56. 15950,16123,16296,16471,
  57. 16646,16821,16997,17174,
  58. 17351,17529,17708,17887,
  59. 18066,18246,18427,18608,
  60. 18790,18972,19155,19339,
  61. 19522,19707,19891,20077,
  62. 20263,20449,20636,20823,
  63. 21010,21198,21387,21576,
  64. 21765,21955,22145,22336,
  65. 22527,22718,22910,23102,
  66. 23295,23487,23681,23874,
  67. 24068,24262,24457,24652,
  68. 24847,25042,25238,25434,
  69. 25630,25827,26024,26221,
  70. 26418,26616,26813,27011,
  71. 27210,27408,27607,27806,
  72. 28005,28204,28403,28603,
  73. 28802,29002,29202,29402,
  74. 29603,29803,30003,30204,
  75. 30405,30606,30806,31007,
  76. 31208,31409,31611,31812,
  77. 32013,32214,32415,32617,
  78. 32818,33019,33220,33422,
  79. 33623,33824,34025,34226,
  80. 34427,34628,34829,35030,
  81. 35231,35431,35632,35832,
  82. 36033,36233,36433,36633,
  83. 36832,37032,37232,37431,
  84. 37630,37829,38028,38226,
  85. 38425,38623,38821,39018,
  86. 39216,39413,39610,39807,
  87. 40003,40199,40395,40591,
  88. 40786,40981,41176,41370,
  89. 41564,41758,41951,42144,
  90. 42337,42529,42721,42913,
  91. 43104,43294,43485,43675,
  92. 43864,44054,44242,44431,
  93. 44618,44806,44993,45179,
  94. 45365,45551,45736,45921,
  95. 46105,46288,46471,46654,
  96. 46836,47017,47198,47379,
  97. 47559,47738,47917,48095,
  98. 48272,48449,48626,48802,
  99. 48977,49151,49325,49499,
  100. 49672,49844,50015,50186,
  101. 50356,50526,50694,50862,
  102. 51030,51197,51363,51528,
  103. 51693,51857,52020,52182,
  104. 52344,52505,52665,52825,
  105. 52984,53142,53299,53455,
  106. 53611,53766,53920,54073,
  107. 54226,54378,54529,54679,
  108. 54828,54976,55124,55271,
  109. 55416,55561,55706,55849,
  110. 55991,56133,56273,56413,
  111. 56552,56690,56827,56963,
  112. 57099,57233,57366,57499,
  113. 57630,57761,57891,58020,
  114. 58147,58274,58400,58525,
  115. 58649,58772,58894,59015,
  116. 59135,59254,59372,59489,
  117. 59605,59720,59834,59947,
  118. 60058,60169,60279,60388,
  119. 60496,60602,60708,60813,
  120. 60916,61019,61120,61221,
  121. 61320,61418,61515,61611,
  122. 61706,61800,61893,61985,
  123. 62075,62165,62253,62340,
  124. 62426,62511,62595,62678,
  125. 62760,62840,62919,62998,
  126. 63075,63151,63226,63299,
  127. 63372,63443,63513,63582,
  128. 63650,63717,63782,63847,
  129. 63910,63972,64033,64092,
  130. 64151,64208,64264,64319,
  131. 64373,64425,64477,64527,
  132. 64576,64624,64670,64716,
  133. 64760,64803,64844,64885,
  134. 64924,64962,64999,65035,
  135. 65069,65102,65134,65165,
  136. 65195,65223,65250,65276,
  137. 65301,65324,65346,65367,
  138. 65387,65406,65423,65439,
  139. 65454,65467,65480,65491,
  140. 65501,65509,65517,65523,
  141. 65528,65532,65534,65535,
  142. };

四、FFT以及计算幅值

接下来进行编写对FFT进行初始化的函数。

  1. void RFFT_Init()
  2. {
  3. RFFT_f32_setInputPtr(hnd_rfft, (float *)FFT_input);
  4. RFFT_f32_setOutputPtr(hnd_rfft, FFT_output);
  5. RFFT_f32_setStages(hnd_rfft, FFT_STAGES);
  6. RFFT_f32_setFFTSize(hnd_rfft, FFT_SIZE);
  7. RFFT_f32_setMagnitudePtr(hnd_rfft, FFT_magnitude_phase);
  8. RFFT_f32_setPhasePtr(hnd_rfft, FFT_magnitude_phase);
  9. RFFT_f32_setTwiddlesPtr(hnd_rfft, FFT_twiddleFactors);
  10. RFFT_f32_sincostable(hnd_rfft);
  11. RFFT_ADC_f32_setTailPtr(hnd_rfft_adc, &(hnd_rfft->OutBuf));
  12. RFFT_ADC_f32_setInBufPtr(hnd_rfft_adc, FFT_input);
  13. RFFT_adc_f32_win(FFT_input, Window, FFT_SIZE );
  14. }

进行FFT以及对FFT结果进行计算的函数。

  1. void RFFT_Caculate()
  2. {
  3. float* mag;
  4. RFFT_adc_f32(hnd_rfft_adc);
  5. RFFT_f32_mag(hnd_rfft); //计算幅度
  6. mag=RFFT_f32_getMagnitudePtr(hnd_rfft);
  7. RFFT_Analyse(mag);
  8. }

需注意的是,FFT的返回值不是幅值,我们需对其进行转换。

首先对FFT的结果进行取模,使用RFFT_f32_mag()函数,得到幅度。

接着对幅度再进行相应的处理,如下表:

 即,直流分量的幅值等于幅度除以采样点数,其余的的幅值等于幅值除以采样点数的一半。

对幅度进行分析的函数

  1. void RFFT_Analyse(float *src)
  2. {
  3. Uint16 i;
  4. float FFT_Value; //FFT_Value为该频率点的FFT后的幅度
  5. Uint16 peak_index[RFFT_Analyse_MaxNum];//存放的峰值个数为RFFT_Analyse_MaxNum个
  6. memset(peak_index, 0U, RFFT_Analyse_MaxNum*sizeof(Uint16)); //初始化将指定区块为0值
  7. memset(rfft_analyse.freq, 0U, RFFT_Analyse_MaxNum*sizeof(float));
  8. memset(rfft_analyse.Amp, 0U, RFFT_Analyse_MaxNum*sizeof(float));
  9. rfft_analyse.Wave_Num=RFFT_Peak_Find(src,FFT_SIZE/2,peak_index);
  10. for(i=0;i<rfft_analyse.Wave_Num;i++)
  11. {
  12. rfft_analyse.freq[i]=(float) Fs / FFT_SIZE * peak_index[i];//计算频率,已调试过,为准确频率
  13. FFT_Value=*(src+peak_index[i]);
  14. rfft_analyse.Amp[i] = 2 * FFT_Value / FFT_SIZE * 3 * 2; //将幅度转换为幅值公式:幅值=(幅度/(采样点数/2))该点不为FFT后结果的第一个点和最后一个点,乘3是ADC的转化范围为0-3V,乘2是汉宁窗的幅度恢复系数
  15. }
  16. rfft_analyse.DC_Amp=src[0]/FFT_SIZE * 3 * 2; //直流分量的幅值=幅度/采样点数,乘2是汉宁窗的幅度恢复系数
  17. }

在主函数中,对RFFT_Init()和RFFT_Caculate()完成调用,即可。

五、核验结果

准备阶段结束,进入仿真。

仿真结果如下:

频率点:

 对应幅值:

 直流分量:

 可以看到加窗后FFT的结果于输入信号相吻合,测试结束。

需要工程文件的可以私信我,本文如有错误,也请多多指出。

本文编写时,参考了以下相关文章:

【1】窗函数总结_wxyczhyza的博客-CSDN博客_窗函数衰减​​​​​​【2】TMS320F28335调用官方库进行FFT频谱分析_PeepFuture橙子的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/287697
推荐阅读
相关标签
  

闽ICP备14008679号