• m分别通过matlab和FPGA实现基于高阶循环谱的信号载波调制识别(四阶循环累量)仿真


    目录

    1.算法描述

    2.仿真效果预览

    3.verilog核心程序

    4.完整FPGA工程


    1.算法描述

           通信信号调制方式自动识别在军事和民用领域的信号检测、威胁干扰分析、频谱监测管理等方面有着广泛应用,是非合作通信的关键技术。其主要任务是对截获信号进行处理,比如变频、去载波、参数估计等,从中提取特征参数,然后利用适当的算法对调制信号的调制方式做出判决,为后续信号解调等处理提供依据。  

           由于数字调制信号越来越多地应用于通信信号处理领域,因此对数字信号调制识别的研究也越来越多。传统的调制识别的判决方法有:决策判决法、高阶累积量算法和人工神经网络算法等。但是决策判决法在低信噪比环境中识别率不高,而基于人工神经网络的识别方法计算复杂度较高。信号的高阶累积量算法具有很好的抗噪性能,故对基于高阶累积量的通信信号调制识别算法的研究受到了广泛重视。文献利用高阶累积量实现了对 2ASK/BPSK,4ASK,4PSK,2FSK,4FSK信号的分类。文献利用四阶和六阶累积量实现了对 2ASK,4ASK,8ASK,QPSK,8P-SK,16QAM信号的分类。文献利用二、四、六阶累积量实现了对 2ASK/BPSK,4ASK,QPSK,2FSK,4FSK,8FSK,16QAM信号的分类。文献对高阶累积量的四阶、五阶累积量进行了优化和仿真,但是在低信噪比的环境下,对信号的识别率都不高。

           所谓高阶统计量,通常是指信号的高阶矩,高阶累积量等信号统计信息的统称。在这些高阶统计量中,高阶累积量具有十分重要的重用,不同阶数的累积量可以反映出信号的不同特征,因此高阶累积量往往应用在信号分类,信号调制方式识别等领域。高阶累积量中的二阶累积量和四阶累积量可以有效抑制高斯白噪声的干扰,且对相位偏移具有一定的容错能力,其数学表达式为:

     下面摘取调制方式在高阶累积量上的差异,

    2.仿真效果预览

    Quartus II 12.1 (64-Bit),

    ModelSim-Altera 6.6d (Quartus II 11.0) Starter Edition

     

     

     

     

    3.verilog核心程序

    matlab部分:

    1. clc;
    2. close all;
    3. clear all;
    4. addpath 'func\'
    5. rng('default')
    6. SEL = 3;
    7. %假定接收端已经实现载波同步
    8. seldata = randi([0 1],1,1000);
    9. fs = 10000;
    10. R = 250;
    11. fc = 1900;
    12. if SEL == 1
    13. y_2psk1 = func_BPSK(seldata,fs,fc,R,1);
    14. y_2psk2 = func_BPSK(seldata,fs,fc,R,1.05);
    15. com = y_2psk1+y_2psk2;
    16. end
    17. if SEL == 2
    18. y_4psk1 = func_QPSK(seldata,fs,fc,R,1);
    19. y_4psk2 = func_QPSK(seldata,fs,fc,R,1.05);
    20. com = y_4psk1+y_4psk2;
    21. end
    22. if SEL == 3
    23. y_8psk1 = func_8PSK(seldata,fs,fc,R,1);
    24. y_8psk2 = func_8PSK(seldata,fs,fc,R,1.05);
    25. com = y_8psk1+y_8psk2;
    26. end
    27. %%%%%%%%四阶循环累积量%%%%%%%%%%%%
    28. NOI = max(abs(com))/100;
    29. y = NOI + awgn(com,30,'measured');
    30. yft = abs(fft(y,4096));
    31. figure;
    32. plot(fs*(0:2047)/4096,yft(1:2048))
    33. title('频谱');
    34. fc = fc;
    35. alpha =(fc-R):1:(fc+R);
    36. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    37. S4 = y.^4;
    38. S2 = y.^2;
    39. m = size(y);
    40. k =(1:m(2))';
    41. n = 0;
    42. for i=1:(2*R+1)
    43. i
    44. e1(:,i) = exp(-j*8*pi*alpha(i)*k./fs);
    45. su1(:,i) = S4'.*e1(:,i);
    46. C1(i) = mean(su1(:,i));
    47. e2(:,i) = exp(-j*4*pi*alpha(i)*k./fs);
    48. su2(:,i) = S2'.*e2(:,i);
    49. C2(i) = mean(su2(:,i));
    50. n = n+1;
    51. end
    52. C=C1-3*C2.^2;
    53. figure
    54. plot(alpha,abs(C));
    55. if SEL == 1
    56. title('BPSK');
    57. end
    58. if SEL == 2
    59. title('QPSK');
    60. end
    61. if SEL == 3
    62. title('8PSK');
    63. end
    64. C40 = C;
    65. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    66. S4 = (y.^3).*conj(y);
    67. S21 = y.^2;
    68. S22 = y.*conj(y);
    69. m = size(y);
    70. k =(1:m(2))';
    71. n = 0;
    72. for i=1:(2*R+1)
    73. i
    74. e1(:,i) = exp(-j*8*pi*alpha(i)*k./fs);
    75. su1(:,i) = S4'.*e1(:,i);
    76. C1(i) = mean(su1(:,i));
    77. e2(:,i) = exp(-j*4*pi*alpha(i)*k./fs);
    78. su2(:,i) = (S21'.*e2(:,i));
    79. C2(i) = mean(su2(:,i));
    80. e3(:,i) = exp(-j*4*pi*alpha(i)*k./fs);
    81. su3(:,i) = (S22'.*e3(:,i));
    82. C3(i) = mean(su3(:,i));
    83. n = n+1;
    84. end
    85. C=C1-3*C2.*C3;
    86. figure
    87. plot(alpha,abs(C));
    88. if SEL == 1
    89. title('BPSK');
    90. end
    91. if SEL == 2
    92. title('QPSK');
    93. end
    94. if SEL == 3
    95. title('8PSK');
    96. end
    97. C41 = C;
    98. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    99. S4 = (y.^2).*(conj(y).^2);
    100. S21 = y.^2;
    101. S22 = conj(y).^2;
    102. S3 = y.*conj(y);
    103. m = size(y);
    104. k =(1:m(2))';
    105. n = 0;
    106. for i=1:(2*R+1)
    107. i
    108. e1(:,i) = exp(-j*8*pi*alpha(i)*k./fs);
    109. su1(:,i) = S4'.*e1(:,i);
    110. C1(i) = mean(su1(:,i));
    111. e2(:,i) = exp(-j*4*pi*alpha(i)*k./fs);
    112. su2(:,i) = (S3'.*e2(:,i));
    113. C2(i) = mean(su2(:,i));
    114. e4(:,i) = exp(-j*4*pi*alpha(i)*k./fs);
    115. su4(:,i) = (S22'.*e4(:,i)).*(S22'.*e3(:,i));
    116. C4(i) = mean(su4(:,i));
    117. n = n+1;
    118. end
    119. C=C1 - 2*C2.^2 - C4;
    120. figure
    121. plot(alpha,abs(C));
    122. if SEL == 1
    123. title('BPSK');
    124. end
    125. if SEL == 2
    126. title('QPSK');
    127. end
    128. if SEL == 3
    129. title('8PSK');
    130. end
    131. C42 = C;
    132. FM = round([abs(C41/C40);abs(C41/C42)]);
    133. FM

    1. `timescale 1ns / 1ps
    2. module C4012_cal(
    3. i_clk,
    4. i_rst,
    5. i_din,
    6. o_C40,
    7. o_FM
    8. );
    9. input i_clk;
    10. input i_rst;
    11. input signed[15:0]i_din;
    12. output signed[15:0]o_C40;
    13. output[1:0] o_FM;
    14. reg signed[31:0]S2s;
    15. reg signed[63:0]S4s;
    16. always @(posedge i_clk or posedge i_rst)
    17. begin
    18. if(i_rst)
    19. begin
    20. S2s <= 32'd0;
    21. S4s <= 64'd0;
    22. end
    23. else begin
    24. S2s <= i_din * i_din;
    25. S4s <= i_din * i_din * i_din * i_din;
    26. end
    27. end
    28. wire signed[15:0]S2;
    29. wire signed[15:0]S4;
    30. assign S2 = S2s[31:16];
    31. assign S4 = S4s[63:48];
    32. reg[11:0]cnt;
    33. always @(posedge i_clk or posedge i_rst)
    34. begin
    35. if(i_rst)
    36. begin
    37. cnt <= 12'd0;
    38. end
    39. else begin
    40. if(cnt == 12'd2000)
    41. cnt <= 12'd2000;
    42. else
    43. cnt <= cnt + 12'd1;
    44. end
    45. end
    46. reg start;
    47. always @(posedge i_clk or posedge i_rst)
    48. begin
    49. if(i_rst)
    50. begin
    51. start <= 1'd0;
    52. end
    53. else begin
    54. if(cnt == 12'd406)
    55. start <= 1'd1;
    56. else
    57. start <= 1'd0;
    58. end
    59. end
    60. wire signed[15:0]DOUT;
    61. C4012 C4012_u(
    62. .CLK (i_clk),
    63. .RST (i_rst),
    64. .START(start),
    65. .DIN (i_din[15:6]),
    66. .DOUT (DOUT),
    67. .FM (o_FM)
    68. );
    69. reg [15:0] CNT;
    70. reg signed[15:0]o_C40;
    71. reg flag;
    72. always @(posedge i_clk or posedge i_rst)
    73. begin
    74. if(i_rst)
    75. begin
    76. flag <= 1'b0;
    77. end
    78. else begin
    79. if(DOUT >= 1000)
    80. flag <= 1'b1;
    81. else
    82. flag <= flag;
    83. end
    84. end
    85. always @(posedge i_clk or posedge i_rst)
    86. begin
    87. if(i_rst)
    88. begin
    89. CNT <= 16'd0;
    90. end
    91. else begin
    92. if(flag == 1'b1)
    93. begin
    94. CNT <= CNT + 16'd1;
    95. if(CNT >= 16'd10000)
    96. CNT <= 16'd10000;
    97. end
    98. end
    99. end
    100. always @(posedge i_clk or posedge i_rst)
    101. begin
    102. if(i_rst)
    103. begin
    104. o_C40 <= 16'd0;
    105. end
    106. else begin
    107. if(CNT <= 100)
    108. o_C40 <= DOUT;
    109. else
    110. o_C40 <= 16'd0;
    111. end
    112. end
    113. endmodule
    114. 01_107m

    4.完整FPGA工程

    V

  • 相关阅读:
    css过渡效果
    mysql迁移以及迁移后配置文件的编写
    计算机毕设(附源码)JAVA-SSM基于JAVA的校园电车租赁系统
    如何获取JDK Proxy动态代理生成的代理类源代码
    Vue 项目前端响应式布局及框架搭建
    Springboot MybatisPlus整合多数据源
    232. 用栈实现队列
    计算机视觉实验二:基于支持向量机和随机森林的分类(Part one: 编程实现基于支持向量机的人脸识别分类 )
    flink1.13报错:The file STDOUT does not exist on the TaskExecutor
    LeetCode-热题100-笔记-day28
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/128177353