这两天提取一组变压器数据,发现谐波比较严重,我在处理前想只拿到工频信号进行处理。原始数据就这样
杂波比较多。尤其是通道3因为是三相变压器的关系,受到另外两项的干扰更严重。
首先因为我测量的是漏磁通,因为漏磁通的变化受到工频电流的影响,故信号应该是成正弦50HZ变化的。
所以第一步先滤波我使用的是Matlab2020a自带的工具箱设计函数
在命令行窗口输入
filterDesigner
我的设置如下
第一步
选择你要设计滤波器,低通高通带通带阻,这里我就不解释了
这里FIR和IIR两种数字滤波选择
我对这两种方式的简单理解为,IIR是有反馈的他的输出是上一次的输出和这一次输入计算的,
FIR是无反馈的,他是某种函数映射对应关系。选择窗,这是选择窗计算快一点。
详细的区别可以自行查阅资料,这里我也只是用一下。
第二步
这里的设置阶数一般没有要求就最低阶就行,因为自己瞎捣鼓容易让他不收敛。这个缩放通带就默认就可以,其实不是很精确的滤波,这些参数的区别意义不大
这里HZ这里可以选择很多,我选择的就是HZ
FS这里很关键,他是你信号的采样频率的一半。比如我的采样器是10K那我的FS就是5000.如果你是自己设计的函数,就是你计划采样率的一半。计划采样率由你采样的信号的频率决定,理论上是采样信号频率的2倍
工程上采用(2-10)倍。
这里FPASS就是通带
FSTOP就是阻带。
这里就是通带阻带的衰减。
设计完成后我们点击设计滤波器
此时MATLAB会给我们生成频率响应衰减曲线 ,看一下满不满足我们的预期满足的生成函数。
Fs = 5000; % Sampling Frequency
Fpass = 50; % Passband Frequency
Fstop = 51; % Stopband Frequency
Dpass = 0.057501127785; % Passband Ripple
Dstop = 0.0001; % Stopband Attenuation
flag = 'scale'; % Sampling Flag
% Calculate the order from the parameters using KAISERORD.
[N,Wn,BETA,TYPE] = kaiserord([Fpass Fstop]/(Fs/2), [1 0], [Dstop Dpass]);
% Calculate the coefficients using the FIR1 function.
b = fir1(N, Wn, TYPE, kaiser(N+1, BETA), flag);
Hd = dfilt.dffir(b);
这就是其生成的数据,我们使用的就是这个”Hd“
% Tip: If you have the Signal Processing Toolbox, you can design a
% filter, D, using DESIGNFILT. Then you can use Y = FILTER(D,X) to
% filter your data.
根据MATLAB里的提示我们使用工具箱函数设计的滤波器可以直接使用
Y=filter(Hd,X);
我这里x是一行x列。
这就是我的滤波波形
这是我处理后的三相数据,之前是测量量只有两项
中间断点是因为我获取数据的问题,正常情况下应该是正弦波;
处理完成之后采用傅里叶变换提取幅频特性
N = length(data_b1);%求取抽样点数
y3 = fft(data_b1);%对信号进行傅里叶变换
f= (0:round(N/2)-1)*Fs/length(y);%频率显示
figure(3);
plot(f,abs(y3(1:round(N/2)))/(N/2));
xlabel('Frequency/ (HZ)');ylabel('Amplitude');
title('信号的频谱');
grid;
幅频特性如下50hz的幅频特性找到了。
完整程序如下
clc
clear
rng('default')
filepath='C:\Users\zz\Desktop\全部传感器方向一致 - 副本\';%文件夹的路径
char4=[filepath,'*.dat'];
cd (filepath);
dat_sum=dir(char4);
[hang,lei] = size(dat_sum);
data_hang=hang*1600;
% data_shuzu=zeros([data_hang,8]);
for i=1:hang %dat_nub是要读入的文件的个数
if i<10
f1=fopen([filepath 'magind000' num2str(i) '.dat']);
elseif i>=10&&i<100
f1=fopen([filepath 'magind00' num2str(i) '.dat']);
elseif i>=100&&i<1000
f1=fopen([filepath 'magind0' num2str(i) '.dat']);
else
f1=fopen([filepath 'magind' num2str(i) '.dat']);
end
A=fread(f1,[1600,8],'double'); %8个通道,每个通道1600个数据
fclose(f1);
if i==1
data_shuzu=A;
else
data_shuzu=[data_shuzu;A];
end
end
data_satrt=1;
data_add=40000;
data_end=data_satrt+data_add;
%采样率
Mix_Signal_1=data_shuzu(data_satrt:data_end,1)';
Mix_Signal_2=data_shuzu(data_satrt:data_end,3)';
Mix_Signal_3=data_shuzu(data_satrt:data_end,5)';
Mix_Signal_4=data_shuzu(data_satrt:data_end,2)';
Mix_Signal_5=data_shuzu(data_satrt:data_end,4)';
Mix_Signal_6=data_shuzu(data_satrt:data_end,6)';
%% 滤波
Fs = 5000; % Sampling Frequency
Fpass = 50; % Passband Frequency
Fstop = 51; % Stopband Frequency
Dpass = 0.057501127785; % Passband Ripple
Dstop = 0.0001; % Stopband Attenuation
flag = 'scale'; % Sampling Flag
% Calculate the order from the parameters using KAISERORD.
[N,Wn,BETA,TYPE] = kaiserord([Fpass Fstop]/(Fs/2), [1 0], [Dstop Dpass]);
% Calculate the coefficients using the FIR1 function.
b = fir1(N, Wn, TYPE, kaiser(N+1, BETA), flag);
Hd = dfilt.dffir(b);
Signal_Filter1=filter(Hd,Mix_Signal_1);
Signal_Filter3=filter(Hd,Mix_Signal_3);
Signal_Filter2=filter(Hd,Mix_Signal_2);
data_s=30262;
data_3t= 2000;
data_e=data_s+data_3t;
data_b1=Signal_Filter1(1,data_s:data_e-1)';
%% FFT%%
N = length(data_b1);%求取抽样点数
y3 = fft(data_b1);%对信号进行傅里叶变换
f = 10/N*(0:round(N/2)-1)*1000;%显示实际频点的一半
figure(3);
plot(f,abs(y3(1:round(N/2)))/(N/2));
xlabel('Frequency/ (HZ)');ylabel('Amplitude');
title('信号的频谱');
grid;