基于Matlab的FIR滤波器的设计与实现

FIR滤波器的设计与实现

摘 要:在数字信号处理中,滤波器在去除噪声和提取有用信号方面扮演着重要的角色。有限脉冲响应(FIR)滤波器是两种常见的数字滤波器。课程主要是设计FIR滤波器是解决生活实际中的问题,探讨FIR滤波器的设计与实现方法,包括它们的基本理论、设计过程和实现技术。介绍滤波器的基本理念和工作原理,然后利用MATLAB进行仿真实验,详细地展示了滤波器的设计与实现过程,并对实验结果进行了深入分析。

关键词:有限脉冲响应滤波器,数字滤波器,滤波器设计,滤波器实现,信号处理,MATLAB

Design and Implementation of FIR Filters

Abstract: In digital signal processing, filters play an essential role in removing noise and extracting useful signals. Finite Impulse Response (FIR) filters are among the two common types of digital filters. This course primarily deals with designing FIR filters to solve practical problems in everyday life, exploring the methods of designing and implementing FIR filters, including their fundamental theory, design process, and implementation techniques. It introduces the basic concepts and working principles of filters, then uses MATLAB for simulation experiments, showing in detail the process of designing and implementing filters, and conducting an in-depth analysis of the experimental results.

Key words: Finite Impulse Response filters, digital filters, filter design, filter implementation, signal processing, MATLAB.


 1 绪论

1.1系统研究的背景及意义

1.1.1 背景

随着技术的快速发展和进步,信号处理成为了一个重要的研究领域,在通信、生物医疗、军事防务等高效准确地处理和解析信号数据显得尤为重要,噪声会严重影响信号质量,特别是在各种物理环境的影响下,信号容易受到外界的影响,设计和实现IIR和FIR滤波器的变得特别重要。

1.1.2 意义

FIR滤波器在信号处理中扮演着关键角色,尤其FIR滤波器的设计与实现,对于优化信号处理效果和应对复杂任务至关重要。深入探讨滤波器的工作原理,以及FIR滤波器的特点和优势,能够帮助我们理解滤波器的多样性,并根据实际需求选择最合适的设计方法。随着数字信号处理技术在各领域的应用不断扩大,对滤波器设计与实现的学习和研究将有助于提升我们的专业技能,应对未来的挑战。

1.2国内外研究现状

1.2.1国外研究现状

在国外,滤波器技术的研究已经形成了一个比较完善的理论体系,很多先进的设计和实现技术已经被广泛应用于实践中,很多国际著名的科研机构和企业,如MIT、Stanford University、Microsoft、Google等企业都有专门的团队进行滤波器技术的研究和开发,发表了大量的高质量的研究论文,并且开发出了许多具有高度创新性的滤波器产品

1.2.2 国内研究现状

在国内,对滤波器技术的研究也取得了不少的成果。各个高校在这个领域都有深入的研究,培养了大量的高层次人才。而且随着我国经济的快速发展,滤波器技术在很多产业领域,例如移动通信、人工智能、医疗设备等都得到了广泛的应用。然而,与国外相比,我们在一些关键技术和核心算法方面还有一定的差距,这需要我们在未来的研究中加以弥补。

2 滤波器的原理

2.1.1滤波原理

滤波器可以对噪音信号中的噪音进行滤波衰减,得到一个特定频率的信号,或消除一个特定频率后的电源信号。 滤波器是一种选频装置,可以使信号中特定的频率成分通过,而极大地衰减其他频率成分。利用滤波器的这种选频作用,可以滤除干扰噪声或进行频谱分析。

2.2.2窗函数法

傅立叶变换是数字信号处理的重要工具之一,其作用范围是正负无穷,但是在实际信号测试处理中,我们无法采样和分析无限长的信号,所以我们只能采取有限长度的信号进行仿真测量。因此,可以对原始时域信号hd(n)截取,将截取的部分片段信号进行周期扩展,这样就可以模拟实现得到一个虚拟的无限长信号,后续再对其进行傅立叶变换和频谱分析。但是,这样的截断会带来频谱泄露,使频谱发生畸变。所以,需要采用不同的截取函数w(n )对信号进行截断,可以有效减少频谱能量泄露,称此截取函数w(n )为窗函数,可用式h(n)=hd(n)*w(n)表示。

N = 23;
b = 3.3953;
n = 0:1:N-1;
a = b ./ (sqrt(1 - (2*n/(N-1) - 1).^2));
结果为下面数值
Inf	8.15006722990091	5.90528473676333	4.94690318313724	4.40153936596492	4.05099190887426	3.81184490668287	3.64482086945037	3.52908263182263	3.45285155644645	3.40941773241170	3.39530000000000	3.40941773241170	3.45285155644645	3.52908263182263	3.64482086945037	3.81184490668287	4.05099190887426	4.40153936596492	4.94690318313724	5.90528473676333	8.15006722990092	Inf

classdef app5_0 < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure              matlab.ui.Figure
        TabGroup              matlab.ui.container.TabGroup
        Tab                   matlab.ui.container.Tab
        noise2EditField       matlab.ui.control.NumericEditField
        noise2EditFieldLabel  matlab.ui.control.Label
        noiseEditField        matlab.ui.control.NumericEditField
        noiseEditFieldLabel   matlab.ui.control.Label
        fEditField            matlab.ui.control.NumericEditField
        fEditFieldLabel       matlab.ui.control.Label
        NEditField            matlab.ui.control.NumericEditField
        NEditFieldLabel       matlab.ui.control.Label
        FsEditField           matlab.ui.control.NumericEditField
        FsLabel               matlab.ui.control.Label
        SignalFFTButton       matlab.ui.control.Button
        Button_2              matlab.ui.control.Button
        Button                matlab.ui.control.Button
        UIAxes2               matlab.ui.control.UIAxes
        UIAxes                matlab.ui.control.UIAxes
        Tab_2                 matlab.ui.container.Tab
        Button_6              matlab.ui.control.Button
        Button_5              matlab.ui.control.Button
        Button_4              matlab.ui.control.Button
        Button_3              matlab.ui.control.Button
        RsEditField           matlab.ui.control.NumericEditField
        RsEditFieldLabel      matlab.ui.control.Label
        RpEditField           matlab.ui.control.NumericEditField
        RpEditFieldLabel      matlab.ui.control.Label
        WsHzEditField         matlab.ui.control.NumericEditField
        WsHzEditFieldLabel    matlab.ui.control.Label
        WpHzEditField         matlab.ui.control.NumericEditField
        WpHzEditFieldLabel    matlab.ui.control.Label
        butterworthButton     matlab.ui.control.Button
        Tree                  matlab.ui.container.CheckBoxTree
        IIRNode               matlab.ui.container.TreeNode
        Node_3                matlab.ui.container.TreeNode
        ButterworthNode       matlab.ui.container.TreeNode
        FIRNode               matlab.ui.container.TreeNode
        Node_7                matlab.ui.container.TreeNode
        Node_4                matlab.ui.container.TreeNode
        hammingNode           matlab.ui.container.TreeNode
        kaiserNode            matlab.ui.container.TreeNode
        Node_5                matlab.ui.container.TreeNode
        UIAxes4               matlab.ui.control.UIAxes
        UIAxes3               matlab.ui.control.UIAxes
        Tab_3                 matlab.ui.container.Tab
        UIAxes6               matlab.ui.control.UIAxes
        UIAxes5               matlab.ui.control.UIAxes
        ContextMenu           matlab.ui.container.ContextMenu
        Menu                  matlab.ui.container.Menu
        Menu2                 matlab.ui.container.Menu
    end

    
    properties (Access = private)
        Property % Description
        f,tn,xn,xn_noise,N,fn,Fs,Hs_copy,A,B,Bz,Az;% 全局变量
        f_noise,f_noise2,Xk,Wp,Ws,Rp,Rs;
        Wk,Wn,Hs,Hz,Xk_noise,Yk,yn;
        beta,ftype,Hz_copy;
    end
    

    % Callbacks that handle component events
    methods (Access = private)

        % Button pushed function: Button
        function ButtonPushed(app, event)
           app.N = app.NEditField.Value; % 定义一个变量N
           app.Fs = app.FsEditField.Value;% 定义采样频率
           app.tn = (0:app.N-1)*(1/app.Fs); % 根据采样频率Fs生成时间序列tn

           app.f =app.fEditField.Value; % 获取用户输入的频率(f)值
           app.xn = sin(2*pi*app.f*app.tn);% 生成频率为f的正弦波信号xn
           plot(app.UIAxes,app.tn,app.xn); % 在UIAxes上绘制xn关于tn的图形
           xlim(app.UIAxes,[0,8/app.f]);% 设置UIAxes的x轴显示范围,显示信号的周期。

           plot(app.UIAxes5,app.tn,app.xn); % 在UIAxes上绘制xn关于tn的图形
           xlim(app.UIAxes5,[0,8/app.f]);% 设置UIAxes的x轴显示范围,设置显示信号的周期。
        end

        % Button pushed function: Button_2
        function Button_2Pushed(app, event)
            app.f_noise = app.noiseEditField.Value;% 获取用户输入的噪声频率值
            app.f_noise2 = app.noise2EditField.Value;% 定义第二个噪声频率值

            % 在原始的正弦波信号xn上添加两个频率(f_noise和f_noise2)的正弦噪声
            app.xn_noise = app.xn+0.6*sin(2*pi*app.f_noise*app.tn)+0.2*sin(2*pi*app.f_noise2*app.tn);
            plot(app.UIAxes,app.tn,app.xn_noise); % 在UIAxes上绘制含有噪声的信号xn_noise关于tn的图形
            xlim(app.UIAxes,[0,8/app.f]);% 设置UIAxes的x轴显示范围,显示加噪信号的周期。
        end

        % Button pushed function: SignalFFTButton
        function SignalFFTButtonPushed(app, event)
            app.Xk = fft(app.xn_noise,app.N);% 对添加了噪声的信号xn_noise进行快速傅里叶变换,并将结果赋给Xk
            
            app.Xk=abs(app.Xk); % 获取Xk的绝对值,以便观察每个频率下的振幅
            % 创建频率向量fn,其值范围从0到(Fs/N)*(N-1),这将作为我们频域图形的x轴
            app.fn=app.Fs/app.N*(0:app.N-1);
            plot(app.UIAxes2,app.fn,app.Xk);% 在UIAxes2上画出频域图形,x轴是频率fn,y轴是振幅Xk
            xlim(app.UIAxes2,[0,app.Fs/2]);% 设置UIAxes2的x轴显示范围,从0开始,结束点为Fs/2。
        end

        % Selection changed function: Tree
        function TreeSelectionChanged(app, event)
            selectedNodes = app.Tree.SelectedNodes;
           if selectedNodes == app.ButterworthNode
            app.Wp=app.WpHzEditField.Value;% 设定通带截止频率
            app.Ws=app.WsHzEditField.Value;%阻带截止频率
            app.Wp=2*pi*app.Wp;% 将截止频率转化为角频率
            app.Ws=2*pi*app.Ws;% 将截止频率转化为角频率
            app.Rp=app.RpEditField.Value;% 设定通带最大衰减为1dB
            app.Rs=app.RsEditField.Value;% 设置阻带最小衰减为40dB
            [M,Wc]=buttord(app.Wp,app.Ws,app.Rp,app.Rs,"s"); % 计算滤波器的阶数和截止角频率
            [app.B,app.A]=butter(M,Wc,"low","s");%模拟Butterworth低通滤波器
            
            app.Wk=2*pi*app.fn; % 将频率转换为角频率
            app.Wn=app.Wk/app.Fs; % 将角频率进行标准化
            app.Hs=freqs(app.B,app.A,app.Wk); % 计算滤波器的频率响应
            app.Hs=abs(app.Hs);%取绝对值
            app.Hs_copy=app.Hs;%Hs赋值给Hs_copy
            app.Hs=20*log10(app.Hs);% 将幅度转化为dB单位
            %这个函数实际上是使用脉冲响应不变法进行转换的
            [app.Bz,app.Az]=impinvar(app.B,app.A,app.Fs); % 将模拟滤波器转化为数字滤波器
            app.Hz=freqz(app.Bz,app.Az,app.Wn);
            app.Hz=abs(app.Hz);
           
            app.Hz=20*log10(app.Hz);% 将幅度转化为dB单位

            plot(app.UIAxes3,app.fn,app.Hs,"r",app.fn,app.Hz,"b");
            xlim(app.UIAxes3,[0,app.Fs/2]);

         elseif selectedNodes==app.Node_3                

            app.Wp = app.WpHzEditField.Value; % 设定通带截止频率
            app.Ws = app.WsHzEditField.Value; % 阻带截止频率
            app.Wp = 2 * pi * app.Wp; % 将截止频率转化为角频率
            app.Ws = 2 * pi * app.Ws; % 将截止频率转化为角频率
            app.Rp = app.RpEditField.Value; % 设定通带最大衰减为1dB
            app.Rs = app.RsEditField.Value; % 设置阻带最小衰减为40dB
            [M, Wc] = buttord(app.Wp, app.Ws, app.Rp, app.Rs, "s"); % 计算滤波器的阶数和截止角频率
            [app.B, app.A] = butter(M, Wc, "low", "s"); % 模拟Butterworth低通滤波器
            
            app.Wk = 2 * pi * app.fn; % 将频率转换为角频率
            app.Wn = app.Wk / app.Fs; % 将角频率进行标准化
            app.Hs = freqs(app.B, app.A, app.Wk); % 计算滤波器的频率响应
            app.Hs = abs(app.Hs); % 取绝对值
            app.Hs_copy = app.Hs;
            app.Hs = 20 * log10(app.Hs); % 将幅度转化为dB单位
            
            % 使用双线性变换将模拟滤波器转化为数字滤波器
            [app.Bz, app.Az] = bilinear(app.B, app.A, app.Fs);
            
            app.Hz = freqz(app.Bz, app.Az, app.Wn);
            app.Hz = abs(app.Hz);
            
            app.Hz = 20 * log10(app.Hz); % 将幅度转化为dB单位
            
            plot(app.UIAxes3, app.fn, app.Hs, "r", app.fn, app.Hz, "b");
            xlim(app.UIAxes3, [0, app.Fs / 2]);


        elseif selectedNodes==app.kaiserNode                
            
            % 使用kaiser窗口法设计的滤波器
            app.Wp = app.WpHzEditField.Value; % 设定通带截止频率
            app.Ws = app.WsHzEditField.Value; % 阻带截止频率
            app.Rp = app.RpEditField.Value; % 设定通带最大衰减为1dB
            app.Rs = app.RsEditField.Value; % 设置阻带最小衰减为40dB
                            
            % 使用kaiserord()函数计算窗口长度N和β参数
            [app.N, app.Wn, app.beta, app.ftype] = kaiserord([app.Wp app.Ws]/(app.Fs/2), [1 0], [10^(app.Rp/-20) 10^(app.Rs/-20)]);
                            
            % 使用fir1()函数设计滤波器
            app.Bz = fir1(app.N, app.Wn, app.ftype, kaiser(app.N+1, app.beta), 'noscale');
           
            disp(app.beta);    
            disp(app.N);
            disp(app.Bz);
          
            % 计算滤波器的频率响应
            app.Hz = freqz(app.Bz,1,1024,app.Fs);
            app.Hz = abs(app.Hz);
            app.Hz_copy = app.Hz; % 保留幅度信息供后续使用
            app.Hz = 20*log10(app.Hz); % 将幅度转化为dB单位
                            
            % 在应用程序的Axes中绘制滤波器的频率响应
            app.f = (0:1023)*(app.Fs/2/1023); % 创建频率向量
            plot(app.UIAxes3, app.f, app.Hz);
            xlim(app.UIAxes3, [0,app.Fs/2]);

            % 计算滤波器的单位脉冲响应
            hn = fir1(app.N, app.Wn, app.ftype, kaiser(app.N+1, app.beta));
            
            % 在Axes6中绘制滤波器的单位脉冲响应
            stem(app.UIAxes6, 0:app.N, hn);

          elseif selectedNodes==app.Node_5

                % 定义通带和阻带截止频率
            app.Wp = app.WpHzEditField.Value;
            app.Ws = app.WsHzEditField.Value;
            
            % 定义理想的频率响应
            F = [0 app.Wp/(app.Fs/2) app.Ws/(app.Fs/2) 1];  % 频率范围
            M = [1 1 0 0];  % 频率响应
            app.N = 128;  % 定义频率采样点的数量
            
            % 利用频率抽样法设计滤波器
            Hf = fir2(app.N, F, M);
            app.Bz = Hf;  % 脉冲响应就是滤波器的系数
            
            % 计算滤波器的频率响应
            app.Hz = freqz(app.Bz,1,1024,app.Fs);
            app.Hz = abs(app.Hz);
            app.Hz_copy = app.Hz;
            app.Hz = 20*log10(app.Hz);
            
            % 绘制滤波器的频率响应
            app.f = (0:1023)*(app.Fs/2/1023);
            plot(app.UIAxes3, app.f, app.Hz);
            xlim(app.UIAxes3, [0,app.Fs/2]);

         elseif selectedNodes==app.Node_7
            app.Fs = app.FsEditField.Value;
            app.f = [app.WpHzEditField.Value, app.WsHzEditField.Value] / (app.Fs/2); % 设定通带和阻带边界,必须归一化
            m = [1, 0]; % 在通带和阻带中的期望幅度
            dat1 = (10^(app.RpEditField.Value/20)-1)/(10^(app.RpEditField.Value/20)+1); % 通带允许波动,由衰减值转换
            dat2 = 10^(-app.RsEditField.Value/20); % 阻带允许波动,由衰减值转换
            rip = [dat1, dat2]; % 放入数组中,作为输入参数
            
            [M,fo,ao,W] = remezord(app.f, m, rip); % 计算滤波器的阶数、归一化频率边界、放大系数以及权值
            M = M + 1; % 提高阶数以获得更好的滤波器性能
            app.Bz = remez(M, fo, ao, W); % 利用remez算法设计FIR滤波器
            app.Az = 1; % FIR滤波器的A为1
            
            app.Wk = 2 * pi * app.fn; % 将频率转换为角频率
            app.Wn = app.Wk / app.Fs; % 将角频率进行标准化
            
            % 计算滤波器的频率响应
            app.Hz = freqz(app.Bz, app.Az, app.Wn);
            app.Hz = abs(app.Hz);
            
            app.Hz = 20 * log10(app.Hz); % 将幅度转化为dB单位
            
            plot(app.UIAxes3, app.fn, app.Hz, "b");
            xlim(app.UIAxes3, [0, app.Fs / 2]);

           end
        end

        % Button pushed function: butterworthButton
        function butterworthButtonPushed(app, event)
            app.Xk_noise=fft(app.xn_noise,app.N); % 对加噪信号进行傅里叶变换
            app.Xk_noise=abs(app.Xk_noise); % 获取FFT结果的幅度
            app.Yk=app.Hs_copy.*app.Xk_noise; % 用滤波器频响和信号的FFT结果进行点乘得到过滤后的信号的FFT结果
            plot(app.UIAxes4,app.fn,app.Yk);
            xlim(app.UIAxes4,[0,app.Fs/2]); 
            
            app.yn=filtfilt(app.Bz,app.Az,app.xn_noise);
            plot(app.UIAxes,app.tn,app.yn);
            xlim(app.UIAxes,[0,8/app.f]);

            plot(app.UIAxes5,app.tn,app.yn);
            xlim(app.UIAxes5,[0,8/app.f]);
        end

        % Button pushed function: Button_3
        function Button_3Pushed(app, event)
             % 对加噪信号进行傅里叶变换
            app.N=app.NEditField.Value;
            app.Xk_noise = fft(app.xn_noise,app.N); 
            app.Xk_noise = abs(app.Xk_noise); % 获取FFT结果的幅度
            
            % 绘制噪声信号的频谱
            app.fn = (0:app.N-1)*(app.Fs/app.N); % 创建频率向量
            plot(app.UIAxes4, app.fn, app.Xk_noise);
            xlim(app.UIAxes4, [0,app.Fs/2]);
            
            % 对加噪信号进行滤波处理
            app.yn = filtfilt(app.Bz, 1, app.xn_noise);
            
            % 对滤波后的信号进行傅里叶变换
            app.Yk = fft(app.yn, app.N);
            app.Yk = abs(app.Yk);
            
            % 绘制过滤后的信号的频谱
            plot(app.UIAxes4, app.fn, app.Yk);
            xlim(app.UIAxes4, [0,app.Fs/2]);
            
            % 绘制滤波后的信号
            plot(app.UIAxes, app.tn, app.yn);            
            % 根据数据长度设置x轴范围
            xlim(app.UIAxes, [0, 0.008]);
            
            plot(app.UIAxes5, app.tn, app.yn);            
            % 同样根据数据长度设置x轴范围
            xlim(app.UIAxes5, [0, 0.008]);

            
        end

        % Button pushed function: Button_4
        function Button_4Pushed(app, event)
            app.Xk_noise=fft(app.xn_noise,app.N); % 对加噪信号进行傅里叶变换
            app.Xk_noise=abs(app.Xk_noise); % 获取FFT结果的幅度
            app.Yk=app.Hs_copy.*app.Xk_noise; % 用滤波器频响和信号的FFT结果进行点乘得到过滤后的信号的FFT结果
            plot(app.UIAxes4,app.fn,app.Yk);
            xlim(app.UIAxes4,[0,app.Fs/2]); 
            
            app.yn=filtfilt(app.Bz,app.Az,app.xn_noise);
            plot(app.UIAxes,app.tn,app.yn);
            xlim(app.UIAxes,[0,8/app.f]);

            plot(app.UIAxes5,app.tn,app.yn);
            xlim(app.UIAxes5,[0,8/app.f]);
        end

        % Button pushed function: Button_5
        function Button_5Pushed(app, event)
              % 对加噪信号进行傅里叶变换
            app.Xk_noise = fft(app.xn_noise,app.N); 
            app.Xk_noise = abs(app.Xk_noise);
            
            % 绘制噪声信号的频谱
            app.fn = (0:app.N-1)*(app.Fs/app.N);
            plot(app.UIAxes4, app.fn, app.Xk_noise);
            xlim(app.UIAxes4, [0,app.Fs/2]);
            
            % 对加噪信号进行滤波处理
            app.yn = filtfilt(app.Bz, 1, app.xn_noise);
            
            % 对滤波后的信号进行傅里叶变换
            app.Yk = fft(app.yn, app.N);
            app.Yk = abs(app.Yk);
            
            % 绘制过滤后的信号的频谱
            plot(app.UIAxes4, app.fn, app.Yk);
            xlim(app.UIAxes4, [0,app.Fs/2]);       
            % 绘制滤波后的信号
            plot(app.UIAxes, app.tn, app.yn);
            xlim(app.UIAxes, [0, 0.008]);
            
            plot(app.UIAxes5, app.tn, app.yn);
            xlim(app.UIAxes5, [0, 0.008]);
        end

        % Button pushed function: Button_6
        function Button_6Pushed(app, event)
        app.Xk_noise = fft(app.xn_noise,app.N); % 对加噪信号进行傅里叶变换
        app.Xk_noise = abs(app.Xk_noise); % 获取FFT结果的幅度
        
        % 绘制噪声信号的频谱
        app.fn = (0:app.N-1)*(app.Fs/app.N);
        plot(app.UIAxes4, app.fn, app.Xk_noise);
        xlim(app.UIAxes4, [0,app.Fs/2]);
        
        % 对加噪信号进行滤波处理
        app.yn = filtfilt(app.Bz, 1, app.xn_noise);
        
        % 对滤波后的信号进行傅里叶变换
        app.Yk = fft(app.yn, app.N);
        app.Yk = abs(app.Yk);
        
        % 绘制过滤后的信号的频谱
        plot(app.UIAxes4, app.fn, app.Yk);
        xlim(app.UIAxes4, [0,app.Fs/2]);
        
        % 绘制滤波后的信号
        plot(app.UIAxes, app.tn, app.yn);
        xlim(app.UIAxes, [0, 0.008]);
        
        plot(app.UIAxes5, app.tn, app.yn);
        xlim(app.UIAxes5, [0, 0.008]);

        end
    end

    % Component initialization
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [100 100 640 480];
            app.UIFigure.Name = 'MATLAB App';

            % Create TabGroup
            app.TabGroup = uitabgroup(app.UIFigure);
            app.TabGroup.Position = [1 1 640 480];

            % Create Tab
            app.Tab = uitab(app.TabGroup);
            app.Tab.Title = '信号发生器';

            % Create UIAxes
            app.UIAxes = uiaxes(app.Tab);
            title(app.UIAxes, '原信号、加噪信号、滤波信号')
            xlabel(app.UIAxes, 'X')
            ylabel(app.UIAxes, 'Y')
            zlabel(app.UIAxes, 'Z')
            app.UIAxes.NextPlot = 'add';
            app.UIAxes.Position = [311 213 320 226];

            % Create UIAxes2
            app.UIAxes2 = uiaxes(app.Tab);
            title(app.UIAxes2, '信号频谱图')
            xlabel(app.UIAxes2, 'X')
            ylabel(app.UIAxes2, 'Y')
            zlabel(app.UIAxes2, 'Z')
            app.UIAxes2.Position = [312 1 319 205];

            % Create Button
            app.Button = uibutton(app.Tab, 'push');
            app.Button.ButtonPushedFcn = createCallbackFcn(app, @ButtonPushed, true);
            app.Button.FontSize = 18;
            app.Button.FontColor = [0.302 0.7451 0.9333];
            app.Button.Position = [100 217 100 30];
            app.Button.Text = '生成信号';

            % Create Button_2
            app.Button_2 = uibutton(app.Tab, 'push');
            app.Button_2.ButtonPushedFcn = createCallbackFcn(app, @Button_2Pushed, true);
            app.Button_2.FontSize = 18;
            app.Button_2.FontColor = [0.302 0.7451 0.9333];
            app.Button_2.Position = [100 182 100 30];
            app.Button_2.Text = '加噪';

            % Create SignalFFTButton
            app.SignalFFTButton = uibutton(app.Tab, 'push');
            app.SignalFFTButton.ButtonPushedFcn = createCallbackFcn(app, @SignalFFTButtonPushed, true);
            app.SignalFFTButton.FontSize = 18;
            app.SignalFFTButton.FontColor = [0.302 0.7451 0.9333];
            app.SignalFFTButton.Position = [99 85 103 30];
            app.SignalFFTButton.Text = 'Signal FFT';

            % Create FsLabel
            app.FsLabel = uilabel(app.Tab);
            app.FsLabel.HorizontalAlignment = 'right';
            app.FsLabel.FontSize = 18;
            app.FsLabel.Position = [67 371 25 23];
            app.FsLabel.Text = 'Fs';

            % Create FsEditField
            app.FsEditField = uieditfield(app.Tab, 'numeric');
            app.FsEditField.FontSize = 18;
            app.FsEditField.Position = [107 370 100 24];
            app.FsEditField.Value = 10000;

            % Create NEditFieldLabel
            app.NEditFieldLabel = uilabel(app.Tab);
            app.NEditFieldLabel.HorizontalAlignment = 'right';
            app.NEditFieldLabel.FontSize = 18;
            app.NEditFieldLabel.Position = [67 340 25 23];
            app.NEditFieldLabel.Text = 'N';

            % Create NEditField
            app.NEditField = uieditfield(app.Tab, 'numeric');
            app.NEditField.FontSize = 18;
            app.NEditField.Position = [107 339 100 24];
            app.NEditField.Value = 1024;

            % Create fEditFieldLabel
            app.fEditFieldLabel = uilabel(app.Tab);
            app.fEditFieldLabel.HorizontalAlignment = 'right';
            app.fEditFieldLabel.FontSize = 18;
            app.fEditFieldLabel.Position = [67 309 25 23];
            app.fEditFieldLabel.Text = 'f';

            % Create fEditField
            app.fEditField = uieditfield(app.Tab, 'numeric');
            app.fEditField.FontSize = 18;
            app.fEditField.Position = [107 308 100 24];
            app.fEditField.Value = 1000;

            % Create noiseEditFieldLabel
            app.noiseEditFieldLabel = uilabel(app.Tab);
            app.noiseEditFieldLabel.HorizontalAlignment = 'right';
            app.noiseEditFieldLabel.FontSize = 18;
            app.noiseEditFieldLabel.Position = [37 154 48 23];
            app.noiseEditFieldLabel.Text = 'noise';

            % Create noiseEditField
            app.noiseEditField = uieditfield(app.Tab, 'numeric');
            app.noiseEditField.FontSize = 18;
            app.noiseEditField.Position = [100 153 100 24];
            app.noiseEditField.Value = 2600;

            % Create noise2EditFieldLabel
            app.noise2EditFieldLabel = uilabel(app.Tab);
            app.noise2EditFieldLabel.HorizontalAlignment = 'right';
            app.noise2EditFieldLabel.FontSize = 18;
            app.noise2EditFieldLabel.Position = [27 125 58 23];
            app.noise2EditFieldLabel.Text = 'noise2';

            % Create noise2EditField
            app.noise2EditField = uieditfield(app.Tab, 'numeric');
            app.noise2EditField.FontSize = 18;
            app.noise2EditField.Position = [100 124 100 24];
            app.noise2EditField.Value = 2000;

            % Create Tab_2
            app.Tab_2 = uitab(app.TabGroup);
            app.Tab_2.Title = '滤波器';

            % Create UIAxes3
            app.UIAxes3 = uiaxes(app.Tab_2);
            title(app.UIAxes3, '损耗函数曲线')
            xlabel(app.UIAxes3, 'X')
            ylabel(app.UIAxes3, 'Y')
            zlabel(app.UIAxes3, 'Z')
            app.UIAxes3.Position = [338 237 300 185];

            % Create UIAxes4
            app.UIAxes4 = uiaxes(app.Tab_2);
            title(app.UIAxes4, '过滤后信号的频谱图')
            xlabel(app.UIAxes4, 'X')
            ylabel(app.UIAxes4, 'Y')
            zlabel(app.UIAxes4, 'Z')
            app.UIAxes4.Position = [338 29 300 185];

            % Create Tree
            app.Tree = uitree(app.Tab_2, 'checkbox');
            app.Tree.SelectionChangedFcn = createCallbackFcn(app, @TreeSelectionChanged, true);
            app.Tree.Position = [41 98 146 185];

            % Create IIRNode
            app.IIRNode = uitreenode(app.Tree);
            app.IIRNode.Text = 'IIR';

            % Create Node_3
            app.Node_3 = uitreenode(app.IIRNode);
            app.Node_3.Text = '双线性';

            % Create ButterworthNode
            app.ButterworthNode = uitreenode(app.IIRNode);
            app.ButterworthNode.Text = 'Butterworth';

            % Create FIRNode
            app.FIRNode = uitreenode(app.Tree);
            app.FIRNode.Text = 'FIR';

            % Create Node_7
            app.Node_7 = uitreenode(app.FIRNode);
            app.Node_7.Text = '等波纹逼近';

            % Create Node_4
            app.Node_4 = uitreenode(app.FIRNode);
            app.Node_4.Text = '窗函数法';

            % Create hammingNode
            app.hammingNode = uitreenode(app.Node_4);
            app.hammingNode.Text = 'hamming窗';

            % Create kaiserNode
            app.kaiserNode = uitreenode(app.Node_4);
            app.kaiserNode.Text = 'kaiser窗';

            % Create Node_5
            app.Node_5 = uitreenode(app.FIRNode);
            app.Node_5.Text = '频率采样';

            % Create butterworthButton
            app.butterworthButton = uibutton(app.Tab_2, 'push');
            app.butterworthButton.ButtonPushedFcn = createCallbackFcn(app, @butterworthButtonPushed, true);
            app.butterworthButton.Position = [185 211 100 23];
            app.butterworthButton.Text = 'butterworth滤波';

            % Create WpHzEditFieldLabel
            app.WpHzEditFieldLabel = uilabel(app.Tab_2);
            app.WpHzEditFieldLabel.HorizontalAlignment = 'right';
            app.WpHzEditFieldLabel.FontSize = 18;
            app.WpHzEditFieldLabel.Position = [6 407 66 23];
            app.WpHzEditFieldLabel.Text = 'Wp(Hz)';

            % Create WpHzEditField
            app.WpHzEditField = uieditfield(app.Tab_2, 'numeric');
            app.WpHzEditField.FontSize = 18;
            app.WpHzEditField.Position = [87 406 100 24];
            app.WpHzEditField.Value = 1500;

            % Create WsHzEditFieldLabel
            app.WsHzEditFieldLabel = uilabel(app.Tab_2);
            app.WsHzEditFieldLabel.HorizontalAlignment = 'right';
            app.WsHzEditFieldLabel.FontSize = 18;
            app.WsHzEditFieldLabel.Position = [7 370 65 23];
            app.WsHzEditFieldLabel.Text = 'Ws(Hz)';

            % Create WsHzEditField
            app.WsHzEditField = uieditfield(app.Tab_2, 'numeric');
            app.WsHzEditField.FontSize = 18;
            app.WsHzEditField.Position = [87 369 100 24];
            app.WsHzEditField.Value = 2500;

            % Create RpEditFieldLabel
            app.RpEditFieldLabel = uilabel(app.Tab_2);
            app.RpEditFieldLabel.HorizontalAlignment = 'right';
            app.RpEditFieldLabel.FontSize = 18;
            app.RpEditFieldLabel.Position = [44 333 28 23];
            app.RpEditFieldLabel.Text = 'Rp';

            % Create RpEditField
            app.RpEditField = uieditfield(app.Tab_2, 'numeric');
            app.RpEditField.FontSize = 18;
            app.RpEditField.Position = [87 332 100 24];
            app.RpEditField.Value = 1;

            % Create RsEditFieldLabel
            app.RsEditFieldLabel = uilabel(app.Tab_2);
            app.RsEditFieldLabel.HorizontalAlignment = 'right';
            app.RsEditFieldLabel.FontSize = 18;
            app.RsEditFieldLabel.Position = [45 296 27 23];
            app.RsEditFieldLabel.Text = 'Rs';

            % Create RsEditField
            app.RsEditField = uieditfield(app.Tab_2, 'numeric');
            app.RsEditField.FontSize = 18;
            app.RsEditField.Position = [87 295 100 24];
            app.RsEditField.Value = 40;

            % Create Button_3
            app.Button_3 = uibutton(app.Tab_2, 'push');
            app.Button_3.ButtonPushedFcn = createCallbackFcn(app, @Button_3Pushed, true);
            app.Button_3.Position = [185 142 100 23];
            app.Button_3.Text = '窗函数法滤波';

            % Create Button_4
            app.Button_4 = uibutton(app.Tab_2, 'push');
            app.Button_4.ButtonPushedFcn = createCallbackFcn(app, @Button_4Pushed, true);
            app.Button_4.Position = [185 234 100 23];
            app.Button_4.Text = '双线性滤波';

            % Create Button_5
            app.Button_5 = uibutton(app.Tab_2, 'push');
            app.Button_5.ButtonPushedFcn = createCallbackFcn(app, @Button_5Pushed, true);
            app.Button_5.Position = [185 119 100 23];
            app.Button_5.Text = '频率采样法滤波';

            % Create Button_6
            app.Button_6 = uibutton(app.Tab_2, 'push');
            app.Button_6.ButtonPushedFcn = createCallbackFcn(app, @Button_6Pushed, true);
            app.Button_6.Position = [185 165 100 23];
            app.Button_6.Text = '等波纹逼近';

            % Create Tab_3
            app.Tab_3 = uitab(app.TabGroup);
            app.Tab_3.Title = '滤波器2';

            % Create UIAxes5
            app.UIAxes5 = uiaxes(app.Tab_3);
            title(app.UIAxes5, '原信号、滤波信号')
            xlabel(app.UIAxes5, 'X')
            ylabel(app.UIAxes5, 'Y')
            zlabel(app.UIAxes5, 'Z')
            app.UIAxes5.NextPlot = 'add';
            app.UIAxes5.Position = [14 256 309 183];

            % Create UIAxes6
            app.UIAxes6 = uiaxes(app.Tab_3);
            title(app.UIAxes6, '单位脉冲响应h(n)')
            xlabel(app.UIAxes6, 'X')
            ylabel(app.UIAxes6, 'Y')
            zlabel(app.UIAxes6, 'Z')
            app.UIAxes6.Position = [331 256 300 185];

            % Create ContextMenu
            app.ContextMenu = uicontextmenu(app.UIFigure);

            % Create Menu
            app.Menu = uimenu(app.ContextMenu);
            app.Menu.Text = 'Menu';

            % Create Menu2
            app.Menu2 = uimenu(app.ContextMenu);
            app.Menu2.Text = 'Menu2';
            
            % Assign app.ContextMenu
            app.Node_7.ContextMenu = app.ContextMenu;

            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end

    % App creation and deletion
    methods (Access = public)

        % Construct app
        function app = app5_0

            % Create UIFigure and components
            createComponents(app)

            % Register the app with App Designer
            registerApp(app, app.UIFigure)

            if nargout == 0
                clear app
            end
        end

        % Code that executes before app deletion
        function delete(app)

            % Delete UIFigure when app is deleted
            delete(app.UIFigure)
        end
    end
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值