• Matlab信号处理1:模拟去除信号噪声


    一个简单的示例:

    设计Matlab程序,去掉左图信号中大于20Hz的频率,使其变为右图。

    1. % 1.生成原信号并绘图
    2. % 生成10s的信号,每隔0.0001s生成1次
    3. t1 = 0:0.0001:10;
    4. % 原信号
    5. y1 = 3*sin(2*pi*10*t1)+sin(2*pi*40*t1)+sin(2*pi*200*t1);
    6. % 原信号时域图 & 设置横纵轴范围 & 设置图名、横纵轴标签
    7. subplot(321);
    8. plot(t1,y1);
    9. xlim([0 1]);
    10. ylim([-6 6]);
    11. title('原信号时域');
    12. xlabel('时间(s)');
    13. ylabel('幅值');
    14. % 设置横纵轴分度值
    15. set(gca,'XTick',0:0.25:1);
    16. set(gca,'YTick',-6:3:6);
    17. % 2.模拟采样
    18. % 采样时长1s,采样频率100Hz
    19. t2 = 0:0.01:1;
    20. y2 = 3*sin(2*pi*10*t2)+sin(2*pi*40*t2)+sin(2*pi*200*t2);
    21. % 采样信号图 & 设置横纵轴范围 & 设置图名、横纵轴标签 & 设置横纵轴分度值
    22. subplot(322);
    23. plot(t2,y2);
    24. xlim([0 1]);
    25. ylim([-6 6]);
    26. title('采样信号波形');
    27. xlabel('时间(s)');
    28. ylabel('幅值');
    29. set(gca,'XTick',0:0.25:1);
    30. set(gca,'YTick',-6:3:6);
    31. % 3.fft
    32. % 采样后信号的数据长度
    33. dataLength = length(y2);
    34. % 对采样后的信号进行fft
    35. y2FFT = fft(y2,dataLength);
    36. % 求幅值
    37. mag = abs(y2FFT);
    38. % 幅值归一化
    39. mag = mag*2/dataLength;
    40. pha = angle(y2FFT)*180/pi;
    41. % 无效相位置0
    42. for i = 1:dataLength
    43. if (mag(1,i)<0.3)
    44. pha(1,i) = 0;
    45. end
    46. end
    47. % fft后的序列坐标
    48. n = 0:dataLength-1;
    49. % 采样频率
    50. fs = 1/0.01;
    51. % 序列频率
    52. f = (0:dataLength-1)*fs/dataLength;
    53. % fft频域图
    54. % 绘制幅度谱,stem:绘制离散信号图
    55. subplot(323);
    56. stem(f(1:dataLength/2),mag(1:dataLength/2));
    57. xlim([0 50]);
    58. ylim([0 4]);
    59. set(gca,"XTick",0:10:50);
    60. xlabel("频率(Hz)");
    61. title('幅度谱');
    62. % 绘制相位谱
    63. subplot(324);
    64. stem(f(1:dataLength/2),pha(1:dataLength/2));
    65. xlim([0 50]);
    66. set(gca,'XTick',0:10:50);
    67. xlabel("频率(Hz)");
    68. ylabel("相位");
    69. title('相位谱');
    70. % 低通滤波器滤波 详见下面描述
    71. % 载入设计的滤波器
    72. load("my_filter.mat"); % 另存为的名字
    73. % 滤波
    74. % 滤波器系数存放于filtercoe数组中
    75. filtercoe = my_filter; % 设计完滤波器,导出的名字
    76. y_Filtered = filter(filtercoe,1,y2);
    77. % 滤波后的时域图
    78. subplot(326);
    79. plot(t2,y_Filtered);
    80. xlim([0 1]);
    81. ylim([-6 6]);
    82. set(gca,'XTick',0:0.25:1);
    83. set(gca,'YTick',-6:3:6);
    84. title('滤波后时域');
    85. xlabel('时间(s)');
    86. ylabel('幅值');

    注:

    1. 第85行低通滤波器的设计需要在命令行窗口输入filterDesigner以打开滤波器设计窗口,如下图:

    在窗口中设置如下红框中主要参数,然后点击设计滤波器

    生成成后,会出现粉框中的波形。

    点击文件-导出,点击弹出窗口中的导出,在Num处命名导出到工作区的名字

    此时滤波器已经导出到工作区中。

    右击工作区中导出的滤波器,另存为,之后便可通过该滤波器的名称导入到程序中使用

    运行效果:

    遗留问题:

    1. 图3中存在频谱泄露,后续学习如何解决;

    2. 程序中的相关设计仍在学习;

  • 相关阅读:
    SEO效果又慢又差,为什么还会有SEO从业者?
    grid管理下的多实例配置不同监听端口
    spyder打不开了
    Jmeter进阶使用指南-使用断言
    【中级网络工程师】下午网络配置题
    ios开发错误积累
    人口数据集:地级市常住人口与户籍人口、人口1%抽样调查数据两大维度指标数据
    nginx负载均衡
    信安软考——第七章 访问控制技术原理与应用
    react-redux使用
  • 原文地址:https://blog.csdn.net/qq_38967414/article/details/132679169