信号与系统¶
如你所见,信号与系统一共两次大作业,一个5000字的综述和一个MATLAB编程。着重说后一次
第二次大作业多少有些 fly bitch的味道,这里会提到一些必要的技术,剩下的则需要读者自行学习。
电力系统谐波分析¶
第二次是电力系统谐波分析,在五一左右发布,期末考完交,中间有两次精确度排名。谐波分析当你们学完前半学期就有点思路了,基本上是 FFT 处理原始信号,但是这时候会有精确度的问题(可以看看书的第 10 和 11 章),就得加窗,之后还得考虑一些优化办法,例如双峰谱线插值&三峰谱线插值等等。小波变换最好别用,不太可行。
如前所述,这次大作业的核心方法是 fft, 所有的修正方法都会围绕它展开。
实现思路¶
学习路线¶
学期中,推荐大家先去简单学一学MATLAB的基本操作。MATLAB语言和C差别不是很大,注意数组、函数、绘图这几大块的学习。
本次大作业主要用到的函数是:fft, hht, plot
实现思路¶
难点在于 fft 的精确计算,由于频谱泄露等一系列原因,对于 信号的精确分析往往要借助一些修正方法,例如三谱线插值、频谱细化等等。
谐波计算¶
谐波计算有如下的办法
三谱线插值¶
具体原理知网有论文讲解,自己查阅。这个方法实现起来并不困难,不同的窗函数有不同的误差,hamming窗求解频率精度较高,blackharrisman窗求解谐波精度较高,可以自己尝试。
频谱细化¶
频谱细化的主流方法包括 czt 变换和 ZoomFFT, 这里可以使用 czt 变换。贴出一份往届代码供参考:
function [f0,A,phase] = FundCalculation(x,fs,window)
    N = length(x);
    % 设置不同的窗函数
    w = hamming(N,'periodic');
    m = window; 
    L = 0:1/m:0.5;
    % 连续z变换频谱细化
    W = czt(w, m + 1, exp(-1i * 2 * pi / (m * N)), 1);
    index = 1:length(L);
    Alpha = abs(W(end - index + 1)) ./ abs(W(index));
    % 加窗并获得基波指标
    X = fft(x.*w);
    Xa = abs(X);
    m0 = find(Xa == max(Xa), 1);
    if Xa(m0 + 1) > Xa(m0 - 1)
        m1 = m0 + 1;
    else
        m1 = m0 - 1;
    end
    % 三次样条插值估计频率误差
    alpha = Xa(m1) / Xa(m0);
    M = spline(Alpha, L, alpha);
    if m1 < m0
        M = -M;
    end
    f1 = (m0 + M - 1) / N;
    f0=f1 * fs;
    %disp(["fundamental frequency:",f0]);
    %幅值和相位估计
    k = 0:N-1;
    W1 = sum(w'.*exp(1i * 2 * pi * M * k / N));
    A = abs(2 * X(m0) / W1 / sqrt(2));
    phase = angle(X(m0)) - angle(W1);
end
噪声查找¶
去噪方法: 经验模态分解、小波去噪、平滑... 比如:
- 小波去噪
% 小波去噪
denoised_signal = wdenoise(Main0,9,Wavelet='sym5',DenoisingMethod="SURE");
B=smoothdata(denoised_signal,'lowess');
- 经验模态分解
关于噪声分布,可以考虑使用频率直方图绘制。