信号与系统 实验三
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三、连续时间系统的频率响应
一、实验目的:
1 加深对连续时间系统频率响应理解;
2 掌握借助计算机计算任意连续时间系统频率响应的方法。
二、实验原理:
连续时间系统的频率响应可以直接通过所得表达式计算,也可以通过零极点图通过用几何的方法来计算,而且通过零极点图可以迅速地判断系统的滤波特性。
根据系统函数H(s)在s平面的零、极点分布可以绘制频响特性曲线,包括幅频特性 H(jw) 曲线和相频特性?(w)曲线。这种方法的原理如下:假定,系统函数H(s)的表达式为
当收敛域含虚轴时,取s = jw,也即在s平面中,s沿虚轴从- j∞移动到+ j∞时,得到:
容易看出,频率特性取决于零、极点的分布,即取决于Zj 、Pi 的位置,而式中K是系数,对于频率特性的研究无关紧要。分母中任一因子(jw- Pi )相当于由极点 p 引向虚轴上某点jw的一个矢量;分子中任一因子(jw-Zj)相当于由零点Zj引至虚轴上某点 jw的一个矢量。
在右图示意画出由零点Zj和极点 Pi 与 jw点连接构成的两个矢量,图中Nj、Mi 分别表示矢量的模,ψj、θi 表示矢量的辐角(矢量与正实轴的夹角,逆时针为正)。对于任意零点Zj 、极点Pi ,相应的复数因子(矢量)都可表示为:
于是,系统函数可以改写为
当ω延虚轴移动时,各复数因子(矢量)的模和辐角都随之改变,于是得出幅频特性曲线和相频特性曲线。这种方法称为s平面几何分析。通过零极点图进行计算的方法是:
1 在S平面上标出系统的零、极点位置;
2 选择S平面的坐标原点为起始点,沿虚轴向上移动,计算此时各极点和零点与该点的膜模和夹角;
3 将所有零点的模相乘,再除以各极点的模,得到对应频率处的幅频特性的值;
4 将所有零点的幅角相加,减去各极点的幅角,得到对应频率处的相角。
三、实验内容
用 C 语言编制相应的计算程序进行计算,要求程序具有零极点输入模块,可以手工输入不同数目的零极点。
计算频率从0~5频段的频谱,计算步长为0.1,分别计算上面两个系统的幅频特性和相频特性,将所得结果用表格列出,并画出相应的幅频特性曲线和相频特性曲线。
判断所给系统的滤波特性,对于带通滤波器,计算出3dB带宽的起始频点和结束频点;对于低通或高通滤波器,计算出3dB带宽的截止或开始的频率。
四、画出系统一和系统二的零极点图
系统一系统二
五、程序流程图和程序代码
程序流程图如下:
程序代码如下:
#include
#include
#include
#include
using namespace std;
int input_poles(float poles[][2]);
int input_zeros(float zeros[][2]);
void show_zeros_and_zeros(int z, int p, float poles[][2], float
zeros[][2]);
double fupin(float w, int z, int p, float poles[][2], float zeros[][2]); double xiangpin(float w, int z, int p, float poles[][2], float
zeros[][2]);
double phase(float x, float y);
double xiuzheng(double x);
#define N 100
#define Pi 3.1415926
void main()
{
float zeros[N][2], poles[N][2],w;
int number_of_zeros=0, number_of_poles=0;
double f,pha;
ofstream file1("F:\\xinhao3.txt");
number_of_poles = input_poles(poles);
number_of_zeros = input_zeros(zeros);
show_zeros_and_zeros(number_of_zeros, number_of_poles, poles, zeros);
for (w = 0; w <= 5.0; w = w + 0.1)
{
f = fupin(w, number_of_zeros, number_of_poles, poles, zeros);
pha = xiangpin(w, number_of_zeros, number_of_poles, poles, zeros);
file1<< w << "\t" << f << "\t"< } file1.close(); system("pause"); } int input_poles(float poles[][2])//poles[][0] for real part and poles[][1] for imaginary part of the poles { int i = 1,j=0; cout << "Please enter the poles." << endl; while (1) { cout << "enter the real part"< cin >> poles[j][0]; cout << "enter the imaginary part"< cin >> poles[j][1]; j++; cout << "Would you continue to enter the poles? 1 for yes and 0 for no" << endl; cin >> i; if (i == 0) break; } return j; } int input_zeros(float zeros[][2])//zeros[][0] for real part and zeros[][1] for imaginary part of the zeros { int i = 1,j=0; cout << "Please enter the zeros." << endl; while (1)