1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 手把手教使用matlab完成Comtrade99格式的故障滤波文件进行数据读取并完成低通滤波器滤波

手把手教使用matlab完成Comtrade99格式的故障滤波文件进行数据读取并完成低通滤波器滤波

时间:2022-09-13 07:58:33

相关推荐

手把手教使用matlab完成Comtrade99格式的故障滤波文件进行数据读取并完成低通滤波器滤波

Comtrade99格式文件(.cfg),例如:配电网络发生故障时生成的信号波形。

直接进入正题:作者使用的是matlab Ra版本。

一.实现步骤

打开matlab Ra,在命令窗口输入guide

在弹出的窗口选择 Blank GUI(Default)

注意这里勾选 下面的 “将新图形另存为:....” 我命名为myGui.fig。

在弹出的窗口中,拖拽 左边3个红色圈圈的部件,放置在栅格中,双击部件后,可在String属性中修改部件名称,如下图。

双击”选择文件“按钮,进一步编辑Callback事件,如下图中红圈:

点击后会自动跳转脚本myGui.m。

跳转至80行,在后面添加代码:

[t,data]= ComtradeRead(); %% 显示axes(handles.fig); %打开fig的句柄

如图所示:

在此之间,需要新建名为ComtradeRead()的脚本,如下图所示:

ComtradeRead.m脚本中的代码如下:

function [t,data] = ComtradeRead()%% 导入数据[CFGFileName,PathName] = uigetfile('*.cfg','选择.CFG文件'); %打开.CFG文件CFGPathFile = [PathName CFGFileName]; %读取.CFG文件路径和名称DatFileName = [CFGFileName(:,1:length(CFGFileName)-4) '.dat']; %获得.DAT文件名称DATPathFile = [PathName DatFileName]; %获得.DAT文件路径%% 读取配置文件CFGid = fopen(CFGPathFile);CFG = textscan(CFGid,'%s','delimiter','\n');fclose(CFGid);CFG_len = length(CFG{1,1});CFG_str = cell(size(CFG{1,1}));for i = 1:CFG_lentemp_str = char(CFG{1,1}{i});CFG_str{i}=textscan(temp_str,'%s','delimiter',',');end% 通道数目No_Ch = str2double(cell2mat(CFG_str{2,1}{1,1}(1)));Ana_Ch = CFG_str{2,1}{1,1}{2,1};Ana_Ch(length(Ana_Ch)) = [];Ana_Ch = str2double(Ana_Ch);Dig_Ch = CFG_str{2,1}{1,1}{3,1};Dig_Ch(length(Dig_Ch)) = [];Dig_Ch = str2double(Dig_Ch);% 采样频率samp_rate = textscan(cell2mat(CFG_str{5+No_Ch,1}{1,1}(1)),'%f');samp_rate = samp_rate{1,1};% 数据长度dat_len = textscan(cell2mat(CFG_str{5+No_Ch,1}{1,1}(2)),'%f');dat_len = dat_len{1,1};% 存储格式format=char(CFG_str{8+No_Ch,1}{1,1}(1));%% 读取数据文件DAT_id = fopen(DATPathFile);algdat = zeros(dat_len,Ana_Ch+2);num = zeros(dat_len,1);time = zeros(dat_len,1);if strcmpi(format, 'BINARY')for i = 1:dat_lennum(i) = fread(DAT_id,1,'int32');time(i) = fread(DAT_id,1,'int32');row_array = fread(DAT_id,Ana_Ch+ceil(Dig_Ch/16),'int16');for j=3:Ana_Ch+2algdat(i,j) = row_array(j-2);endendalgdat(:,1) = num;algdat(:,2) = time;elseDAT = textscan(DAT_id, '%s', 'delimiter', '\n');for i = 1:dat_lenDAT_str = textscan(char(DAT{1,:}(i)), '%n', 'delimiter', ',');for j=1:Ana_Ch+2algdat(i,j) = dat_string(j);endendendfclose(DAT_id);t = algdat(:,2)./1000;%% 获得最终数据data = zeros(dat_len, Ana_Ch);for i = 1:Ana_Chj = i+2;var_string = strcat('Ch',char((CFG_str{j,1}{1,1}{1,1})));multiplier = str2double(CFG_str{j,1}{1,1}{6,1});offset = str2double(CFG_str{j,1}{1,1}{7,1});data(:,i) = algdat(:,i+2)*multiplier+offset;endend

这里要特别注意一点:myGui.m, myGui.fig, ComtradeRead.m要放在同一目录下。

利用IIR二阶低通滤波器处理上述所读取的数据。

2.1方法一:利用matlab的FilterDesigner设计IIR二阶低通滤波器。

首先在matlab命令窗输入fdatool或者filterDesigner。或者在工具栏中,APP里面找到FilterDesigner。

本人设计了一个IIR二阶低通的巴特沃斯滤波器,采样频率Fs为12800HZ,截止频率Fc为600HZ。(Fs和Fc根据自己需要调整),参数设置如下图:

特别声明的一点是:Specify order = 阶数+1; 因此要设计二阶的滤波器,这里需要设置为3。

接下来生成脚本.m文件,点击File ->Generate MATLAB Code -> Filter Design Funcion,另存为IIRLowFilter.m

在myGui.m中调用该函数。

在后面添加如下代码:

y1 = filter(Hd,data(:,1));figure('color',[1,1,1]);subplot(2,1,1)plot(t,data(:,1)) %滤波器信号波形subplot(2,1,2)plot(t,y1) %滤波后信号波形

当然,这里只处理了第一列的数据,作者的cfg中有8列数据。

但处理后,会发现,经过滤波后会产生相位延迟和幅度衰减,于是推荐大家使用第二种方法。

2.1方法二:利用filtfilt设计IIR二阶巴特沃斯低通滤波器。

在myGui.m后面加入以下代码:

fs = 12800;%采样频率Hzfc = 600; %截止频率Hzwn = (fc*2)/fs; %归一化截止频率[B,A] = butter(2,wn);%2阶巴特沃斯y1 = filtfilt(B,A,data(:,1));figure('color',[1,1,1]);subplot(2,1,1)plot(t,data(:,1)) %滤波器信号波形subplot(2,1,2)plot(t,y1) %滤波后信号波形

到这里基本就结束了,有什么问题和指教可以私聊我,共同探讨!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。