• m低信噪比下GPS信号的捕获算法研究,分别使用matlab和FPGA对算法进行仿真和硬件实现


    目录

    1.算法概述

    2.仿真效果预览

    3.MATLAB/FPGA部分代码预览

    4.完整MATLAB/FPGA程序


    1.算法概述

          GPS卫星发送的信号一般由3个分量组成:载波、伪码和导航电文,其中伪码和导航电文采用BPSK技术去调制载波。GPS使用的两个L波段两种载频:

           为了跟踪GPS信号,首先要捕获到GPS信号。将捕获到的GPS信号的数据传递给跟踪过程,再通过跟踪过程便可得到卫星的导航电文。传统的GPS捕获方法有:串行搜索捕获、滑动相关法、循环相关法、PMF算法。 采用分段FFT的方法进行运算,算法基本结构如图1所示。

           这里分段数目为K,那么每个相关器的相关时间为TCA/K。每个相关器处理的C/A码长度为,然后再对处理后的数据进行FFT变换。由于每个FFT对应的点数仅仅为原来的,故其硬件资源较直接的并行FFT算法要节约。

           当接收机处于遮挡比较严重的环境如隧道,高楼林立的市区 GPS信号将变得非常微弱。根据经验,这种情况下,GPS信号的载噪比一般只有44dBhz,甚至更低。在这种情况下,获得的信号频谱非常差,甚至难以搜索到其峰值,因此,我们在检测信号最大值的时候,需要通过如下的运算,这里我们仍假设将信号分为K段进行FFT变化。

            然后对得到的结果取模。当获得超过门限的峰值,则说明此时信号已经捕获,就得到对码相位和多普勒频移估计值,这样做的有点是可以获得峰值更为明显的谱线。

    2.仿真效果预览

    matlab2022a,ise10.1仿真

    3.MATLAB/FPGA部分代码预览

    1. `timescale 1ns / 1ps
    2. module tops(
    3. i_clk,
    4. i_rst,
    5. o_CA,
    6. o_sin,
    7. o_cos,
    8. o_ca_cos,
    9. o_ca_som,
    10. o_sum1,
    11. o_sum2,
    12. o_ca_cos2,
    13. o_ca_som2,
    14. fft_in1,
    15. fft_in2,
    16. fft_out1,
    17. fft_out2
    18. );
    19. input i_clk;
    20. input i_rst;
    21. output signed[1:0] o_CA;
    22. output signed[7:0] o_sin;
    23. output signed[7:0] o_cos;
    24. output signed[9:0] o_ca_cos;
    25. output signed[9:0] o_ca_som;
    26. output signed[13:0]o_sum1;
    27. output signed[13:0]o_sum2;
    28. output signed[9:0] o_ca_cos2;
    29. output signed[9:0] o_ca_som2;
    30. output signed[23:0]fft_in1;
    31. output signed[23:0]fft_in2;
    32. output signed[27:0]fft_out1;
    33. output signed[27:0]fft_out2;
    34. CA_carrier_module CA_carrier_module_u(
    35. .i_clk (i_clk),
    36. .i_rst (i_rst),
    37. .o_CA (),
    38. .o_sin (),
    39. .o_cos (),
    40. .o_ca_cos (o_ca_cos),
    41. .o_ca_sin (o_ca_sin)
    42. );
    43. wire signed[13:0]o_sum1;
    44. wire signed[13:0]o_sum2;
    45. delay_1ms delay_1ms_u1(
    46. .i_clk (i_clk),
    47. .i_rst (i_rst),
    48. .i_data (o_ca_cos),
    49. .o_data1 (),
    50. .o_data2 (),
    51. .o_data3 (),
    52. .o_data4 (),
    53. .o_data5 (),
    54. .o_data6 (),
    55. .o_data7 (),
    56. .o_data8 (),
    57. .o_data9 (),
    58. .o_data10 (),
    59. .o_sum (o_sum1)
    60. );
    61. delay_1ms delay_1ms_u2(
    62. .i_clk (i_clk),
    63. .i_rst (i_rst),
    64. .i_data (o_ca_sin),
    65. .o_data1 (),
    66. .o_data2 (),
    67. .o_data3 (),
    68. .o_data4 (),
    69. .o_data5 (),
    70. .o_data6 (),
    71. .o_data7 (),
    72. .o_data8 (),
    73. .o_data9 (),
    74. .o_data10 (),
    75. .o_sum (o_sum2)
    76. );
    77. reg[1:0]cnt1 = 2'b00;
    78. wire clk2;
    79. always @(posedge i_clk or posedge i_rst)
    80. begin
    81. if(i_rst)
    82. cnt1 <= 2'b00;
    83. else begin
    84. cnt1 <= cnt1 + 1'b1;
    85. end
    86. end
    87. assign clk2 = cnt1[1];
    88. CA_gen CA_gen_u(
    89. .i_clk (clk2),
    90. .i_rst (i_rst),
    91. .o_CA (o_CA)
    92. );
    93. ncos ncos_u(
    94. .reg_select (1'b0),
    95. .clk (i_clk),
    96. .we (1'b1),
    97. .data (26'd16777216),
    98. .sine (o_sin),
    99. .cosine (o_cos)
    100. );
    101. multer multer_u1(
    102. .clk (i_clk),
    103. .a (o_cos),
    104. .b (o_CA),
    105. .p (o_ca_cos2)
    106. );
    107. multer multer_u2(
    108. .clk (i_clk),
    109. .a (o_sin),
    110. .b (o_CA),
    111. .p (o_ca_sin2)
    112. );
    113. wire [23:0]fft_in1;
    114. wire [23:0]fft_in2;
    115. multer2 multer2_u1(
    116. .clk (i_clk),
    117. .a (o_sum1),
    118. .b (o_ca_cos2),
    119. .p (fft_in1)
    120. );
    121. multer2 multer2_u2(
    122. .clk (i_clk),
    123. .a (o_sum2),
    124. .b (o_ca_sin2),
    125. .p (fft_in2)
    126. );
    127. //==============fft==========================
    128. ffts ffts_u1(
    129. .sclr (i_rst),
    130. .fd_in (1'b1),
    131. .fd_out (),
    132. .forward (1'b1),//1;fft;0:ifft
    133. .clk (i_clk),
    134. .rffd (),
    135. .data_valid (),
    136. .dout (fft_out1),
    137. .din (fft_in1),
    138. .size (6'd31)
    139. );
    140. ffts ffts_u2(
    141. .sclr (i_rst),
    142. .fd_in (1'b1),
    143. .fd_out (),
    144. .forward (1'b1),//1;fft;0:ifft
    145. .clk (i_clk),
    146. .rffd (),
    147. .data_valid (),
    148. .dout (fft_out2),
    149. .din (fft_in2),
    150. .size (6'd31)
    151. );
    152. wire signed[13:0]omax1;
    153. wire [9:0]index;
    154. reg signed[13:0]o_power_average=14'd550;
    155. reg signed[22:0]r_power_average=23'd281600;
    156. always @(posedge i_clk or posedge i_rst)
    157. begin
    158. if(i_rst)
    159. begin
    160. o_power_average <= 14'd550;
    161. r_power_average <= 23'd281600;
    162. end
    163. else begin
    164. if(omax1[13] == 1'b1 | omax1==14'd0)
    165. o_power_average <= 14'd550;
    166. else begin
    167. r_power_average <= 172*omax1;
    168. o_power_average <= r_power_average[22:9];
    169. end
    170. end
    171. end
    172. find_max find_max_u(
    173. .clk (i_clk),
    174. .rst (i_rst), //同步复位
    175. .idata (o_fadd),
    176. .iTh1 (o_power_average),
    177. .omax1 (omax1),
    178. .oindex1(index),
    179. .omax2 (),
    180. .oindex2(),
    181. .omax3 (),
    182. .oindex3(),
    183. .oen (),
    184. .oen1 (),
    185. .start ()
    186. );
    187. endmodule
    188. 01_026_m

    4.完整MATLAB/FPGA程序

    matlab源码说明_我爱C编程的博客-CSDN博客

    V

  • 相关阅读:
    CentOS:7 源码安装zeek
    JavaScript前端精确配置设置与监听器使用
    nginx指定prefix路径启动
    提高Python并发性能 - asyncio/aiohttp介绍
    时序预测 | MATLAB实现MLP多层感知机时间序列预测
    map和set的使用
    MySQL INNER JOIN:内连接查询
    SAP Fiori应用索引大全工具和 SAP Fiori Tools 的使用介绍
    基于JAVA-旅游产品销售管理-演示录像2020计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    webpack优化策略
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/127937383