• 使用自功率谱、互功率谱估计滤波器幅频特性


    这段时间终于对工程中的随机信号的一般处理方式有点头绪了,功率谱密度估计是十分重要的方式之一,仍需继续深入细化相关内容。


    示例:使用自功率谱、互功率谱估计滤波器幅频特性,自己实现 & Matlab自带函数实现。

    1. clc;clear;close all;
    2. fs = 44100;
    3. t = 0:1/fs:1-1/fs;
    4. in = randn(size(t));
    5. winlen = 1024;
    6. overlap = winlen/2;
    7. % 滤波
    8. order = 1; % 滤波器阶数高后,则曲线不太平滑
    9. fc = 1200;
    10. [b,a] = butter(order, fc/(fs/2), 'low');
    11. out = filter(b, a, in);
    12. %% 自己实现cpsd、pwelch。整体思路与上周相同,但将功率谱密度估计方法由 相关法 改为 直接法
    13. segments_i = buffer(in, winlen, overlap, "nodelay"); % 存放输入信号的分段交叠
    14. segments_o = buffer(out, winlen, overlap, "nodelay"); % 存放输出信号的分段交叠
    15. numSegments = size(segments_i, 2); % 分段数
    16. wd = hanning(winlen);
    17. spectrum_Pxx = zeros(winlen/2+1,numSegments); % 存放每段估计的自功率谱密度
    18. spectrum_Pxy = zeros(winlen/2+1,numSegments); % 存放每段估计的互功率谱密度
    19. for i = 1:numSegments % 分段估计
    20. % 估计输入信号自功率谱密度
    21. in_fft = fft(segments_i(:,i).*wd);
    22. N = length(in_fft);
    23. P1 = abs(in_fft/N);
    24. P2 = P1(1:floor(N/2)+1);
    25. P2(2:end-1) = 2*P2(2:end-1);
    26. Pxx_ = P2.^2/(N*fs);
    27. % 估计输入、输出信号互功率谱密度
    28. out_fft = fft(segments_o(:,i).*wd);
    29. P3 = abs(out_fft/N);
    30. P4 = P3(1:floor(N/2)+1);
    31. P4(2:end-1) = 2*P4(2:end-1);
    32. Pxy_ = P4 .* conj(P2) / (N*fs);
    33. % 每段的功率谱密度存起来
    34. spectrum_Pxx(:,i) = Pxx_;
    35. spectrum_Pxy(:,i) = Pxy_;
    36. end
    37. f = fs*(0:N/2)/N;
    38. % 计算均值
    39. spectrumAvg_Pxx = mean(spectrum_Pxx, 2);
    40. spectrumAvg_Pxy = mean(spectrum_Pxy, 2);
    41. H2 = abs(spectrumAvg_Pxy) ./ abs(spectrumAvg_Pxx);
    42. subplot(311);
    43. plot(f,20*log10(H2));
    44. title("幅频曲线(自己实现的自功率谱、互功率谱估计)");xlabel("频率");ylabel("db");
    45. %% 自带pwelch、cpsd
    46. [Pxx,f1] = pwelch(in, hanning(winlen),overlap,winlen,fs);
    47. [Pxy,f2] = cpsd(in, out, hanning(winlen),overlap,winlen,fs);
    48. subplot(312);
    49. plot(f1, 20*log10(abs(Pxy ./ Pxx)));
    50. title("幅频曲线(自带的pwelch、cpsd函数)");xlabel("频率");ylabel("db");
    51. %% freqz理想幅频特性曲线
    52. [H3, w] = freqz(b,a);
    53. subplot(313);
    54. f1 = w*fs/2/pi;
    55. plot(f1,20*log10(abs(H3)));
    56. title("幅频曲线(理想)");xlabel("频率");ylabel("db");

    结果图:


    遗留问题:

    该示例中使用高阶滤波器后,幅频特性曲线仍会有较大的波动,有待在后续学习中解决。

  • 相关阅读:
    LeetCode-剑指19-正则表达式匹配
    JS中的BOM
    Kafka 开启SASL/SCRAM认证 及 ACL授权(三)验证
    高并发场景防止超卖的实现
    面试:HashMap
    营销培训感悟
    【Python】如果修改了第三方库(包)的源代码,该怎么做才能还原呢
    基于C++的社交应用的数据存储与实现
    WebStorm 2023:让您更接近理想的开发环境 mac/win版
    吃,吃个大西瓜-第三章
  • 原文地址:https://blog.csdn.net/qq_38967414/article/details/133269049