当前位置:   article > 正文

全相位FFT算法Matlab实现_全相位fft的matlab

全相位fft的matlab

一、参考文献

  1. 王兆华,全相位FFT相位测量法[J].

二、Matlab代码

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %% Zheng Wei, 2023/05/04
  3. %%
  4. %% 用途:如果信号频率f不等于fs/N的整数倍,FFT就会频谱泄露,计算的相位角就不对;
  5. %% 全相位FFT法可以解决这个问题,但要注意,全相位FFT获取的是中心输入样点的相位值。比如
  6. %% 当n=(-N+1:N-1)/fs时,apFFT所求的是n=0点的相位;
  7. %% 当n=(1:2*N-1)/fs时, apFFT所求的是n=N点的相位。
  8. %%
  9. %% 参考文献:《全相位FFT相位测量法》
  10. %%
  11. %% 全相位预处理过程:
  12. %% 1、取一个N点窗函数w(n);
  13. %% 2、w(n) 自己对自己求卷积,得到2N-1的卷积窗;
  14. %% 3、求2N-1的卷积窗的和;
  15. %% 4、归一化卷积窗;
  16. %% 5、将数据的1:2N-1项和归一化卷积窗相乘,得到加窗的2N-1项;
  17. %% 6、将第1项和N+1项......第N-1项和第2N-1项相加,得到经过全相预处理N点序列;
  18. %% 7、做N点FFT。
  19. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  20. clc; % 清理命令行
  21. close all; % 关闭所有图形窗口
  22. clear all; % 清理所有工作区变量
  23. fclose all; % 关闭所有打开的文件
  24. fc = 10e6;%0; % 信号基础频率
  25. fd = 10e3; % 频率偏移
  26. fs = 500e6; % 采样率500Msps
  27. N = 1024; % 如果f不等于fs/N的整数倍,就会造成频谱泄露,计算的相位角就不对
  28. %% 当n =(-N+1:N-1)/fs时,apFFT所求中心点的相位:N_center = 0
  29. %% 当n =(1:2*N-1)/fs时, apFFT所求中心点的相位:N_center = N
  30. % n =(-N+1:N-1)/fs; % 文献上一般都是取这个范围
  31. % N_center = 0;
  32. n =(1:2*N-1)/fs;
  33. N_center = N;
  34. %% 给个波形用于测试验证
  35. r0 = pi/3;
  36. x1_t = exp(j*(2*pi*(fc-fd)*n+r0));
  37. %% 手动计算出初始相位值,然后跟apFFT计算结果进行比对(可能会相差360°)
  38. phase_x1 = mod((2*pi*(fc-fd)*N_center/fs+r0),2*pi) * 180/pi; % 角度
  39. fprintf('手动计算的相位是:\t\t%d°!\n',phase_x1);
  40. %% ==============================================================================
  41. %% 以下是全相位FFT处理实现过程
  42. %% 全相位预处理过程第1-4步:获取窗函数
  43. win = hanning(N)';
  44. win1 = conv(win,win);
  45. win2 = win1/sum(win1);
  46. %% 全相位预处理过程第5步:将数据的1:2N-1项和归一化卷积窗相乘
  47. Rx = x1_t;
  48. y1 = Rx .* win2;
  49. %% 全相位预处理过程第6步:将第1项和N+1项......第N-1项和第2N-1项相加
  50. y1a = y1(N:end) + [0 y1(1:N-1)];
  51. %% 全相位预处理过程第7步:做N点FFT
  52. Rx_fft = fft(y1a,N);
  53. figure('Name','频谱');plot((0:N-1),abs(Rx_fft));title('全相位FFT之后的频谱');
  54. %% ==============================================================================
  55. %% 全相位FFT处理完成之后,获取FFT最大峰值,其对应的相位值即是中心点相位值
  56. [fft_peak, fft_idx] = max(abs(Rx_fft));
  57. max_Rx_fft = Rx_fft(fft_idx);
  58. apFFT_x1_rad = angle(max_Rx_fft); % 弧度
  59. apFFT_x1_phase = apFFT_x1_rad * 180/pi; % 角度
  60. fprintf('全相位FFT计算的相位是: %d°!\n',apFFT_x1_phase);
  61. %% ==============================================================================
  62. %% 如下是直接使用FFT,可用于同apFFT处理效果进行对比
  63. % fft_x_n = fft(x1_t);
  64. % [fft_x_peak, fft_x_idx] = max(abs(fft_x_n));
  65. % max_fft_x = fft_x_n(fft_x_idx);
  66. % fft_x_rad = angle(max_fft_x); % 弧度
  67. % fft_x_phase = fft_x_rad * 180/pi % 角度
  68. % figure('Name','频谱');plot((0:N-1),abs(Rx_fft));title('直接做FFT之后的频谱');

从matlab运行结果可以看到,全相位FFT计算结果与预期结果一致。后续要做的工作,就是把Matlab代码实现过程迁移到FPGA上,用Verilog代码去实现,用Modelsim去做仿真验证,最后再上板测试了。

 

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

闽ICP备14008679号