电机转动过程中电压和电流均存在明显的高频噪声,对电流信号进行fft分析后发现在特定的频率处幅值大,因此想到用陷波的方法削弱噪声。二阶的陷波传递函数为

wc是待消除的频率(rad/s),也叫陷波频率,Q为质量因子,它典型的bode图如下,在wc处幅值突然降低,Q越大,此处的峰越尖。

在MATLAB中用iirnotch生成二阶 IIR 陷波滤波器
[num,den] = iirnotch(w0,bw)
w0是陷波频率,此处要“归一化”,设采样频率fs Hz,要消除f1 Hz的信号,则w0=f1/(0.5fs),bw是滤波器带宽,与Q的关系是:bw=w0/Q。输出的num、den是离散传递函数的分子、分母。对于2024及以后的版本,可以用designNotchPeakIIR代替
[num,den] = designNotchPeakIIR(CenterFrequency=wo,...
QualityFactor=35,Response="notch");
对我的一个2000rpm电机输出的d轴电流做fft分析,由于电机的电感较小,电流波动较大,但是fft分析与绝对幅值无关。除掉0Hz处的峰值,为另外三个峰值幅值进行消除,对应的频率分别是
f0_1 = 9510;% 9.51 kHz
f0_2 = 20000;% 20 kHz
f0_3 = 29500;% 29.5 kHz

% 设定带宽并生成三个离散传递函数
BW1 = 0.001;% 9.51kHz 陷波带宽
BW2 = 0.001;% 20kHz 陷波带宽
BW3 = 0.001;% 29.5kHz 陷波带宽
[num1, den1] = iirnotch(f0_1/(Fs/2), BW1);
[num2, den2] = iirnotch(f0_2/(Fs/2), BW2);
[num3, den3] = iirnotch(f0_3/(Fs/2), BW3);
% 级联成总滤波器
num = conv(num1, conv(num2, num3));
den = conv(den1, conv(den2, den3));
bode图

滤波效果如下,可见有一定的效果,但是并不太明显,这是因为电流存在大量的底噪,并不是干掉几个峰值对应的频率即可解决

对滤波后的数据进行fft,可见虽然在这三个频率处仍存在幅值,但是幅值已经极大降低,陷波存在效果

此处把带宽调大确实可以使滤波效果进一步提高,但是可能会伤害有用信号
参考
1. https://ww2.mathworks.cn/help/dsp/ref/iirnotch.html