一、课题的目标与任务
基本任务:利用MATLAB模拟生成一个基本输入信号 (如三个正弦频率信号的叠加),设计各种滤波器(低通,高通,带通),信号频率和滤波器的技术指标自行设定,设计方法要求为: IIR滤波器采用双线性变换法,和FIR滤波器采用窗函数法。并进行滤波处理,最后得到分离的三个正弦频率信号,并与理论上的滤波效果进行对比和讨论。
二、原理
2.1数字滤波器
数字滤波器是一种用于处理数字信号的系统,可根据频率特性改变信号的频率响应。这些滤波器主要分为两类:Finite Impulse Response(FIR,有限脉冲响应)和Infinite Impulse Response(IIR,无限脉冲响应)。
2.3窗函数法设计FIR滤波器
FIR滤波器(Finite Impulse Response)的输出仅受限于有限数量的输入。其结构由延迟单元和加权系数组成。这种滤波器的特点包括:
1.稳定性:由于没有反馈,FIR滤波器对稳定性要求较低。
2.线性相位特性:所有频率的信号通过滤波器后的相位不会产生变化。
3.设计方法:常见的设计方法包括窗函数法、频率采样法和最小均方误差法。
2.2双线性变换设计IIR滤波器
IIR滤波器(Infinite Impulse Response)有无限长的冲击响应,并且能通过反馈来提供输出。其特点包括:
1.高效性:相较于FIR滤波器,IIR滤波器通常具有更高的效率。
2.非线性相位特性:IIR滤波器的不同频率成分会引起不同程度的相位延迟。
3.设计方法:常用的设计方法包括脉冲响应不变法和双线性变换法。
滤波器的应用:
1.信号处理:滤波器可用于去除噪音、衰减或增强特定频率的信号成分。
2.通信系统:在通信中,滤波器用于调整信号的频率特性,提高信号的传输质量。
3.图像处理:用于去除图像中的噪声或增强特定频率下的图像细节。
在MATLAB等数学软件中,可以使用函数(如fir1和butter)来设计和实现这些滤波器。设计滤波器时,需要考虑到滤波器的阶数、截止频率、通带/阻带的要求以及所需的滤波特性。选择何种类型的滤波器取决于具体的应用需求和所希望的性能特性。
三、实现过程
3.1双线性变换设计IIR滤波器
双线性变换是将模拟滤波器转换为数字滤波器的一种方法。它是一种常用的IIR滤波器设计技术之一。这种方法的基本原理是通过使用双线性变换将模拟滤波器的传递函数转换为数字滤波器的传递函数。下面是双线性变换法设计IIR滤波器的基本原理:
模拟滤波器的传递函数假设有一个模拟滤波器的传递函数为Ha(s),其中s是连续时间域中的复变量。拉普拉斯到Z变换通过双线性变换将模拟滤波器的传递函数Ha(s)转换为数字滤波器的传递函数H(z)。这个变换通常使用拉普拉斯到Z变换完成。
双线性变换是拉普拉斯变换到Z变换的一种近似方法,它将连续时间系统转换为离散时间系统。其数学表达式如下:
其中,s是连续时间复频域变量,z是离散时间复频域变量,T是采样周期。模拟到数字的转换,将模拟滤波器的传递函数Ha(s)用双线性变换转换为数字滤波器的传递函数H(z)H(z),得到离散时间下的数字滤波器。
设计数字滤波器:根据所需的滤波特性(如截止频率、阶数等),设计出离散时间的数字滤波器。
总的来说,双线性变换法通过将连续时间系统映射到离散时间系统,从而实现了模拟滤波器到数字滤波器的转换。这种方法常用于将模拟滤波器设计技术应用于数字滤波器设计中,以满足数字信号处理的需求。
3.2窗函数法设计FIR滤波器
窗函数在FIR(有限脉冲响应)滤波器设计中扮演重要角色,用于对理想滤波器的频域特性进行修正,以获得实际可实现的滤波器。
FIR滤波器设计基本原理:
理想滤波器设计开始时通常设计一个理想的频率响应滤波器,如低通、高通、带通或带阻滤波器。这个理想滤波器的频率响应在频域上具有理想特性,但实际上无法直接实现,因为需要无限长的冲激响应。
截断理想滤波器:
通过截断理想滤波器的冲激响应来实现有限长度的滤波器。这就是FIR滤波器设计的基本思想。
窗函数法:
窗函数法是一种常用的FIR滤波器设计方法。它将理想频率响应的截断与一个窗函数相乘,以得到实际的FIR滤波器系数。常见的窗函数包括矩形窗、汉宁窗、汉明窗、布莱克曼窗等。这些窗函数在频域上具有不同的特性,可以影响滤波器的幅频响应、过渡带宽度、主瓣宽度等。
窗函数的应用:
设计者需要选择合适的窗函数以及截止频率,然后将理想滤波器的频率响应乘以选定的窗函数,得到滤波器的时域冲激响应。
由于窗函数的特性,会导致频域特性的改变,如增加了滤波器的过渡带宽度和
主瓣宽度,同时减小了滤波器的副瓣水平。
实现步骤:
1.选择窗函数
2.根据滤波器设计的要求(截止频率、过渡带宽度等),选择适当的窗函数。
3.设计理想滤波器
4.根据需求设计理想的频率响应,如理想的低通、高通、带通或带阻滤波器。
5.应用窗函数
6.将选定的窗函数与理想频率响应相乘,得到滤波器的时域冲激响应。
窗函数法是一种灵活且常用的FIR滤波器设计方法,它通过选择不同窗函数来调整滤波器的性能,从而满足不同的应用需求。
四、效果对比分析
4.1结果分析
理论上,IIR滤波器(采用双线性变换法)和FIR滤波器(采用窗函数法)在信号处理中有各自的特点和优势。以下是对两种方法滤波效果的详细对比分析。
IIR滤波器(双线性变换法)
优点:1.计算效率高, IIR滤波器相比FIR滤波器具有更高的计算效率,因为它只依赖于前几个输入样本和前几个输出样本,具有递归特性。2.相对较少的延迟, 由于递归特性,IIR滤波器通常具有比较小的延迟。
缺点:1.非线性相位响应,IIR滤波器的非线性相位响应可能会导致信号畸变,特别是在高频部分。2.设计较为复杂,设计IIR滤波器需要考虑极点位置等参数,相对FIR滤波器设计更为复杂。
FIR滤波器(窗函数法)
优点:1.线性相位响应,FIR滤波器具有线性相位特性,不会引入相位畸变。2.易于设计,采用窗函数法设计FIR滤波器较为简单直观,通过选择不同的窗函数可以得到不同性能的滤波器。
缺点:1.较高的计算复杂度,FIR滤波器通常需要更多的计算资源,因为它需要使用更多的采样点进行滤波处理,尤其是在滤波器阶数较高时。2.相对较大的延迟,由于FIR滤波器的零相位特性,可能会引入较大的延迟。
对比分析:
频率特性:
IIR滤波器在设计时能够实现比较尖锐的频率截止特性,但可能伴随着相位失真。
FIR滤波器能够实现更平坦的幅度响应和线性相位特性,但设计复杂度相对较高。
稳定性:
IIR滤波器相对FIR滤波器来说更容易出现数值不稳定性,特别是在设计高阶滤波器时,可能出现数值误差导致滤波器不稳定。
延迟特性:
IIR滤波器通常具有较小的延迟,而FIR滤波器由于其零相位特性,可能会引入较大的延迟。
在对比两种滤波器的效果时,需要根据具体应用场景和要求进行评估。一般来说,对于需要较高性能、线性相位和简单设计的情况,FIR滤波器可能更适合;而对于对计算效率有较高要求或者对轻微相位失真不敏感的情况,IIR滤波器可能更合适。
4.2误差分析
数值误差:
IIR滤波器:在双线性变换法中,由于对连续系统的离散化可能引入数值误差。这可能会导致在滤波过程中的近似误差或计算不精确性。
FIR滤波器:窗函数法中的截断操作可能导致频域的波形畸变,尤其是对于阶数较低的滤波器。此外,对于具有过渡带的滤波器,频率选择误差可能会存在一定程度的影响。
截断误差:
IIR滤波器:由于IIR滤波器具有无限长的脉冲响应,所以在离散化为有限长度时会引入截断误差。
FIR滤波器:窗函数法中的截断操作可能导致频域的波形畸变,尤其是对于阶数较低的滤波器。此外,对于具有过渡带的滤波器,频率选择误差可能会存在一定程度的影响。
数值稳定性:
IIR滤波器:由于其反馈结构和极点位置可能会引起系统不稳定,因此需要特别关注其稳定性。
FIR滤波器:FIR滤波器通常具有良好的稳定性,但是在实际计算中可能会遇到数值溢出的问题,特别是在滤波器系数很大或计算量较大时。
近似误差:
IIR滤波器:在双线性变换过程中,由于将连续时间系统转换为离散时间系统,可能会引入一定的近似误差。
FIR滤波器:窗函数法设计的滤波器在频域上的理想特性和实际实现之间存在一定的近似误差。
五、结果展示
5.1任务说明
基本任务:利用MATLAB模拟生成一个基本输入信号 (如三个正弦频率信号的叠加),设计各种滤波器(低通,高通,带通),信号频率和滤波器的技术指标自行设定,设计方法要求为: IIR滤波器采用双线性变换法,和FIR滤波器采用窗函数法。并进行滤波处理,最后得到分离的三个正弦频率信号,并与理论上的滤波效果进行对比和讨论。
拓展任务1:为便于操作,设计一个简单易用的图形用户界面(GUI) ,来实现各功能。
5.2图形用户界面
5.3主要代码
function varargout = GUI(varargin)
% GUI MATLAB code for GUI.fig
% GUI, by itself, creates a new GUI or raises the existing
% singleton*.
%
% H = GUI returns the handle to a new GUI or the handle to
% the existing singleton*.
%
% GUI('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in GUI.M with the given input arguments.
%
% GUI('Property','Value',...) creates a new GUI or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before GUI_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to GUI_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help GUI
% Last Modified by GUIDE v2.5 16-Dec-2023 23:50:37
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @GUI_OpeningFcn, ...
'gui_OutputFcn', @GUI_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before GUI is made visible.
function GUI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to GUI (see VARARGIN)
% Choose default command line output for GUI
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes GUI wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = GUI_OutputFcn(hObject, eventdata, handles)
if get(handles.radiobutton4,'value')
option=1;
% elseif get(handles.radiobutton2,'value')
% option=2;
% elseif get(handles.radiobutton3,'value')
% option=3;
end
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on selection change in popupmenu2.
function popupmenu2_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu2 contents as cell array
% contents{get(hObject,'Value')} returns selected item from popupmenu2
% --- Executes during object creation, after setting all properties.
function popupmenu2_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on selection change in popupmenu3.
function popupmenu3_Callback(hObject, eventdata, handles)
global num ;
num = get(handles.popupmenu3,'Value');
axes(handles.axes8);
% 生成三个不同频率的正弦信号叠加作为原始信号
fs = 1000; % 采样率
t = 0:1/fs:1; % 时间范围为1秒
f1 = 50; % 第一个正弦波频率为50Hz
f2 = 100; % 第二个正弦波频率为100Hz
f3 = 200; % 第三个正弦波频率为200Hz
x = sin(2*pi*f1*t) + sin(2*pi*f2*t) + sin(2*pi*f3*t); % 三个正弦波叠加
% 设计模拟IIR滤波器
fc_low = 70; % 低通滤波器截止频率
fc_high = 150; % 高通滤波器截止频率
fc_bandpass = [80 120]; % 带通滤波器通带范围
% 设计模拟低通IIR滤波器
[b_low_analog, a_low_analog] = butter(4, fc_low/(fs/2), 'low');
% 设计模拟高通IIR滤波器
[b_high_analog, a_high_analog] = butter(4, fc_high/(fs/2), 'high');
% 设计模拟带通IIR滤波器
[b_bandpass_analog, a_bandpass_analog] = butter(4, fc_bandpass/(fs/2), 'bandpass');
% 双线性变换
[b_low, a_low] = bilinear(b_low_analog, a_low_analog, fs); % 低通滤波器
[b_high, a_high] = bilinear(b_high_analog, a_high_analog, fs); % 高通滤波器
[b_bandpass, a_bandpass] = bilinear(b_bandpass_analog, a_bandpass_analog, fs); % 带通滤波器
% 应用数字滤波器
y_low = filtfilt(b_low, a_low, x); % 低通数字滤波
y_high = filtfilt(b_high, a_high, x); % 高通数字滤波
y_bandpass = filtfilt(b_bandpass, a_bandpass, x); % 带通数字滤波
switch num
case 1
plot(t, y_low);
title(' 通过低通滤波器的频率最小的正弦信号');
case 2
plot(t, y_high);
title(' 通过高通滤波器的频率最大的正弦信号');
case 3
plot(t, y_bandpass);
title(' 通过带通滤波器得到的另一个正弦信号');
end
% % hObject handle to popupmenu3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu3 contents as cell array
% contents{get(hObject,'Value')} returns selected item from popupmenu3
% --- Executes during object creation, after setting all properties.
function popupmenu3_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in radiobutton4.
function radiobutton4_Callback(hObject, eventdata, handles)
set(handles.radiobutton4,'value',1);
% hObject handle to radiobutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of radiobutton4
% --- Executes during object creation, after setting all properties.
function axes7_CreateFcn(hObject, eventdata, handles)
% 生成三个不同频率的正弦信号叠加作为原始信号
fs = 1000; % 采样率
t = 0:1/fs:1; % 时间范围为1秒
f1 = 50; % 第一个正弦波频率为50Hz
f2 = 100; % 第二个正弦波频率为100Hz
f3 = 200; % 第三个正弦波频率为200Hz
x = sin(2*pi*f1*t) + sin(2*pi*f2*t) + sin(2*pi*f3*t); % 三个正弦波叠加
% 设计模拟IIR滤波器
fc_low = 70; % 低通滤波器截止频率
fc_high = 150; % 高通滤波器截止频率
fc_bandpass = [80 120]; % 带通滤波器通带范围
% 设计模拟低通IIR滤波器
[b_low_analog, a_low_analog] = butter(4, fc_low/(fs/2), 'low');
% 设计模拟高通IIR滤波器
[b_high_analog, a_high_analog] = butter(4, fc_high/(fs/2), 'high');
% 设计模拟带通IIR滤波器
[b_bandpass_analog, a_bandpass_analog] = butter(4, fc_bandpass/(fs/2), 'bandpass');
% 双线性变换
[b_low, a_low] = bilinear(b_low_analog, a_low_analog, fs); % 低通滤波器
[b_high, a_high] = bilinear(b_high_analog, a_high_analog, fs); % 高通滤波器
[b_bandpass, a_bandpass] = bilinear(b_bandpass_analog, a_bandpass_analog, fs); % 带通滤波器
% 应用数字滤波器
y_low = filtfilt(b_low, a_low, x); % 低通数字滤波
y_high = filtfilt(b_high, a_high, x); % 高通数字滤波
y_bandpass = filtfilt(b_bandpass, a_bandpass, x); % 带通数字滤波
plot(t, x);
title('原始信号');
% hObject handle to axes7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: place code in OpeningFcn to populate axes7
% --- Executes during object creation, after setting all properties.
function axes8_CreateFcn(hObject, eventdata, handles)
% hObject handle to axes8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: place code in OpeningFcn to populate axes8
% --- Executes on selection change in popupmenu4.
function popupmenu4_Callback(hObject, eventdata, handles)
global num ;
num = get(handles.popupmenu4,'Value');
axes(handles.axes9);
% 生成三个不同频率的正弦信号叠加作为原始信号
fs = 1000; % 采样率
t = 0:1/fs:1; % 时间范围为1秒
f1 = 50; % 第一个正弦波频率为50Hz
f2 = 100; % 第二个正弦波频率为100Hz
f3 = 200; % 第三个正弦波频率为200Hz
x = sin(2*pi*f1*t) + sin(2*pi*f2*t) + sin(2*pi*f3*t); % 三个正弦波叠加
% 设计FIR滤波器
fc_low = 70; % 低通滤波器截止频率
fc_high = 150; % 高通滤波器截止频率
fc_bandpass = [80 120]; % 带通滤波器通带范围
% 设计低通FIR滤波器
order = 100; % 滤波器阶数
b_low = fir1(order, fc_low/(fs/2), 'low', kaiser(order+1, 3)); % 采用Kaiser窗设计
% 设计高通FIR滤波器
b_high = fir1(order, fc_high/(fs/2), 'high', kaiser(order+1, 3)); % 采用Kaiser窗设计
% 设计带通FIR滤波器
b_bandpass = fir1(order, fc_bandpass/(fs/2), 'bandpass', kaiser(order+1, 3)); % 采用Kaiser窗设计
% 应用FIR滤波器
y_low = filtfilt(b_low, 1, x); % 低通数字滤波
y_high = filtfilt(b_high, 1, x); % 高通数字滤波
y_bandpass = filtfilt(b_bandpass, 1, x); % 带通数字滤波
switch num
case 1
plot(t, y_low);
title(' 通过低通滤波器的频率最小的正弦信号');
case 2
plot(t, y_high);
title(' 通过高通滤波器的频率最大的正弦信号');
case 3
plot(t, y_bandpass);
title(' 通过带通滤波器得到的另一个正弦信号');
end
% hObject handle to popupmenu4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu4 contents as cell array
% contents{get(hObject,'Value')} returns selected item from popupmenu4
% --- Executes during object creation, after setting all properties.
function popupmenu4_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
(温馨提示:需要自己建立GUI哦,主要使用了matlab中的一个下拉菜单栏,直接用代码是不行的,可以去学习建立GUI很简单的)