📄 form1.java
字号:
myframe.data=new double[myframe.max+1];//从序号为1开始定义,至max;(长度max+1)
myframe.upDown1.setMaximum(myframe.max);
myframe.upDown2.setMaximum(myframe.max);
myframe.upDown3.setMaximum(myframe.max);
myframe.upDown4.setMaximum(myframe.max);
int result=myframe.showDialog(this);
if(result==DialogResult.YES){//点击确认按钮后,将数据初始化给x[]
x=new double[myframe.length+1];
for(int i=1;i<=x.length-1;i++){//注意!因为数组从1开始初始化,所以序列长度为myframe.data.length-1
x[i]=myframe.data[i];
}
Xinputed=true;//数据初始化完成!
this.displaywhichdata=0;
this.totallength=x.length-1;
this.label1.setText("当前显示数据:输入序列x[]");
this.label3.setText("数据总长度:"+this.totallength+"");
this.timelabel.setText("");
this.ysize=100;
this.steppelix=2;
this.scroll.setValue(0);
this.current=0;
this.panel.invalidate();
solved=false;//尚未处理;
}
}
private void inputXfromfile_click(Object source, Event e)//定义x[]:从文件读入
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.setFilter("自定义数据文件(*.mydata)|*.mydata");
boolean ok=true;
int OK = ofd.showDialog();
if (OK==DialogResult.OK) {
try{
File mydata;
mydata=File.open(ofd.getFileName());
int filelength=mydata.readInt();//文件长度
x=new double[filelength+1];
for(int i=1;i<=x.length-1;i++){//注意!因为数组从1开始初始化,所以序列长度为myframe.data.length-1
x[i]=mydata.readDouble();
}
mydata.close();}catch( EOFException eof ) {
MessageBox.show("读取文件失败!\n可能原因:你读取的文件格式错误,或者文件已经被损坏.","错误!",MessageBox.ICONERROR);
ok=false; }
if(ok==true){
Xinputed=true;//数据初始化完成!
this.displaywhichdata=0;
this.totallength=x.length-1;
this.label1.setText("当前显示数据:输入序列x[]");
this.label3.setText("数据总长度:"+this.totallength+"");
this.timelabel.setText("");
this.ysize=100;
this.steppelix=2;
this.scroll.setValue(0);
this.current=0;
this.panel.invalidate();
solved=false;//尚未处理;
}}
}
private void menushowX_click(Object source, Event e)//输出窗口显示的数据为x[]
{
if(Xinputed==false){//如果尚未定义x【】
MessageBox.show("你尚未定义输入序列x[]!\n请你点击“定义输入序列”菜单命令,定义此输入序列。","警告!",MessageBox.OK+MessageBox.ICONWARNING);
}
else{//如果已经定义x【】
this.displaywhichdata=0;
this.totallength=x.length-1;
this.label1.setText("当前显示数据:输入序列x[]");
this.label3.setText("数据总长度:"+this.totallength+"");
this.steppelix=2;this.ysize=100;
this.scroll.setValue(0);
this.current=0;
panel.invalidate();
}
}
private void menushowH_click(Object source, Event e)//输出窗口显示的数据为y[]
{
if(Xinputed==false){//如果尚未定义x[]
MessageBox.show("你尚未定义输入序列x[]!\n请你点击“初始化”菜单命令,定义输入序列。","警告!",MessageBox.OK+MessageBox.ICONWARNING);
}
if(Yinputed==false){//如果尚未定义滤波器特性
MessageBox.show("你尚未定义滤波器特性!\n请你点击“初始化”菜单命令,设置数字滤波器的参数。","警告!",MessageBox.OK+MessageBox.ICONWARNING);
}
if(Xinputed&Yinputed){//如果已经定义x[]以及滤波器参数(设置滤波器参数完成时就已经得到了h[])
if(solved==false){//如果已经定义,但是没有处理
int i;
//此时已经定义好的数据均存放在x[]和h[]中(从序号1开始,未扩充为2的N次方)
this.timelabel.setText("计算中......");
long starttime=System.currentTimeMillis();//读取开始时间
long endtime=0;//存取计算结束时的时间
int howmanytime=0;//
do{
//根据差分方程求输出
//系数Br【】、Ak【】只取实部
//理论上输出序列y[]可以取无限长度,本例暂时取4096点
y=new double[this.MaxLength];
//double a,bb;
for(int n=0;n<y.length;n++){
y[n]=0;
for(int r=0;r<rank-1;r++){
if(n+1-r>0&&n+1-r<=x.length-1)y[n]-=Br[r].Re*(-x[n+1-r]);
}//for int r
for(int k=1;k<=rank;k++){
if(n-k>=0&&n-k<=y.length-1)y[n]-=y[n-k]*Ak[k-1].Re;
}//for int k
//System.out.println(" y["+n+"]="+y[n]+"");
}//差分方程结束!
endtime=System.currentTimeMillis();//读取运算结束时间
howmanytime+=1;
}while(starttime==endtime);//如果读取计算时间失败,那就重复计算,直到读出为止
this.timelabel.setText("完成计算时间:"+String.valueOf((double)(endtime-starttime)/(double)howmanytime)+"毫秒");
solved=true;//处理完成!
}//solved=false
//关于显示的设置
this.displaywhichdata=2;
this.totallength=y.length;
this.label1.setText("当前显示数据:输入序列x[]经过数字滤波器滤波后的输出序列y[]");
this.label3.setText("显示数据总长度:"+this.totallength+"");
this.steppelix=2;
//this.ysize=100;
double Ymax=Math.abs(y[0]);
for(int i=0;i<this.totallength;i++)
if(Math.abs(y[i])>Ymax) Ymax=Math.abs(y[i]);//得到序列y[]中的最大绝对值
if(Ymax!=0)
this.ysize=(this.panel.getHeight()/2-5)/Ymax;
//this.panel.invalidate();
this.scroll.setValue(0);
this.current=0;
panel.invalidate();
}
}
private void menuItem5_click(Object source, Event e)//滤波器幅频特性Hdb
{
if(Yinputed==false){//如果尚未定义滤波器属性
MessageBox.show("你尚未设置数字滤波器的参数!\n请你点击“初始化”菜单命令,设置数字滤波器的参数。","警告!",MessageBox.OK+MessageBox.ICONWARNING);
}
else{//如果已经定义滤波器属性
this.displaywhichdata=3;
this.label1.setText("当前显示数据:数字滤波器的幅频特性");
this.label3.setText("");
this.currentlabel.setText("");
this.scroll.setEnabled(false);//滚动条不可用
panel.invalidate();
}
}
private void menuItem15_click(Object source, Event e)//滤波器相频特性
{
if(Yinputed==false){//如果尚未定义滤波器属性
MessageBox.show("你尚未设置数字滤波器的参数!\n请你点击“初始化”菜单命令,设置数字滤波器的参数。","警告!",MessageBox.OK+MessageBox.ICONWARNING);
}
else{//如果已经定义滤波器属性
this.displaywhichdata=4;
this.label1.setText("当前显示数据:数字滤波器的相频特性");
this.label3.setText("");
this.currentlabel.setText("");
this.scroll.setEnabled(false);
panel.invalidate();
}
}
private void menuItem16_click(Object source, Event e)//S域数字滤波器的极点位置
{
if(Yinputed==false){//如果尚未定义滤波器属性
MessageBox.show("你尚未设置数字滤波器的参数!\n请你点击“初始化”菜单命令,设置数字滤波器的参数。","警告!",MessageBox.OK+MessageBox.ICONWARNING);
}
else{//如果已经定义滤波器属性
this.displaywhichdata=5;
this.label1.setText("当前显示数据:巴特渥斯滤波器在S平面的极点位置");
this.label3.setText("");
this.currentlabel.setText("");
this.scroll.setEnabled(false);
panel.invalidate();
}
}
private void menuxstepadd_click(Object source, Event e)//增大绘图间距
{
if(this.displaywhichdata==-1||this.displaywhichdata==3||this.displaywhichdata==4||this.displaywhichdata==5){
MessageBox.show("只有在当前显示数据为离散序列时你才能进行此操作。","提示",MessageBox.ICONINFORMATION);
}
else{
this.steppelix*=2;
this.panel.invalidate();
}
}
private void menuxstepsub_click(Object source, Event e)//缩小绘图间距
{
if(this.displaywhichdata==-1||this.displaywhichdata==3||this.displaywhichdata==4||this.displaywhichdata==5){
MessageBox.show("只有在当前显示数据为离散序列时你才能进行此操作。","提示",MessageBox.ICONINFORMATION);
}
else{
this.steppelix*=0.5;
this.panel.invalidate();}
}
private void menuxstepdefault_click(Object source, Event e)//绘图间距设为默认值
{
if(this.displaywhichdata==-1||this.displaywhichdata==3||this.displaywhichdata==4||this.displaywhichdata==5){
MessageBox.show("只有在当前显示数据为离散序列时你才能进行此操作。","提示",MessageBox.ICONINFORMATION);
}
else{
this.steppelix=2;
this.panel.invalidate();}
}
private void menuysizeadd_click(Object source, Event e)//增大纵向幅度
{
if(this.displaywhichdata==-1||this.displaywhichdata==3||this.displaywhichdata==4||this.displaywhichdata==5){
MessageBox.show("只有在当前显示数据为离散序列时你才能进行此操作。","提示",MessageBox.ICONINFORMATION);
}
else{
this.ysize*=2;
this.panel.invalidate();}
}
private void menuysizesub_click(Object source, Event e) //缩小纵向幅度
{
if(this.displaywhichdata==-1||this.displaywhichdata==3||this.displaywhichdata==4||this.displaywhichdata==5){
MessageBox.show("只有在当前显示数据为离散序列时你才能进行此操作。","提示",MessageBox.ICONINFORMATION);
}
else{
this.ysize*=0.5;
this.panel.invalidate();}
}
private void menuysizedefault_click(Object source, Event e)//默认纵向幅度
{
if(this.displaywhichdata==-1||this.displaywhichdata==3||this.displaywhichdata==4||this.displaywhichdata==5){
MessageBox.show("只有在当前显示数据为离散序列时你才能进行此操作。","提示",MessageBox.ICONINFORMATION);
}
else{
this.ysize=100;
this.panel.invalidate();}
}
private void menuysizemax_click(Object source, Event e)//最大值归一化
{
if(this.displaywhichdata==-1||this.displaywhichdata==3||this.displaywhichdata==4||this.displaywhichdata==5){
MessageBox.show("只有在当前显示数据为离散序列时你才能进行此操作。","提示",MessageBox.ICONINFORMATION);
}
else if(this.displaywhichdata==0){//归一化显示的对象是输入序列x[]
double Xmax=Math.abs(x[1]);
for(int i=1;i<=this.totallength;i++)
if(Math.abs(x[i])>Xmax) Xmax=Math.abs(x[i]);//得到序列x[]中的最大绝对值
if(Xmax!=0)
this.ysize=(this.panel.getHeight()/2-5)/Xmax;
this.panel.invalidate();
}
else if(this.displaywhichdata==2){//归一化显示的对象是输出序列y[]
double Ymax=Math.abs(y[0]);
for(int i=0;i<this.totallength;i++)
if(Math.abs(y[i])>Ymax) Ymax=Math.abs(y[i]);//得到序列y[]中的最大绝对值
if(Ymax!=0)
this.ysize=(this.panel.getHeight()/2-5)/Ymax;
this.panel.invalidate();
}//归一化显示的对象是输出序列y[]
else if(this.displaywhichdata==6){//输入序列频谱
double Ymax=Math.sqrt(X[1].Re*X[1].Re+X[1].Im*X[1].Im);
for(int i=2;i<=this.totallength;i++)
if(Math.sqrt(X[i].Re*X[i].Re+X[i].Im*X[i].Im)>Ymax) Ymax=Math.sqrt(X[i].Re*X[i].Re+X[i].Im*X[i].Im);//得到序列y[]中的最大绝对值
if(Ymax!=0)
this.ysize=(this.panel.getHeight()/2-5)/Ymax;
this.panel.invalidate();
}
}
private void menuItem7_click(Object source, Event e)//设置背景色
{
ColorDialog myColorDialog=new ColorDialog();
myColorDialog.setColor(backcolor);// initial color set
int result = myColorDialog.showDialog();
if (result == DialogResult.OK){
backcolor = myColorDialog.getColor();
panel.setBackColor(backcolor);
}
}
private void menuItem8_click(Object source, Event e)//设置绘图颜色
{
ColorDialog myColorDialog=new ColorDialog();
myColorDialog.setColor(drawcolor);// initial color set
int result = myColorDialog.showDialog();
if (result == DialogResult.OK){
drawcolor = myColorDialog.getColor();
panel.invalidate();//重新绘制
}
}
private void menuItem9_click(Object source, Event e)//设置坐标颜色
{
ColorDialog myColorDialog=new ColorDialog();
myColorDialog.setColor(zbcolor);// initial color set
int result = myColorDialog.showDialog();
if (result == DialogResult.OK){
zbcolor = myColorDialog.getColor();
panel.invalidate();//重新绘制
}
}
private void menuItem11_click(Object source, Event e)//程序说明
{
new iirtwo_explain().showDialog(this);
}
private void menuItem12_click(Object source, Event e)//关键字
{
MessageBox.show("模拟滤波器(AF),数字滤波器(DF),无限长单位脉冲响应滤波器(IIR),系统函数,幅度平方函数,通带起伏,极点,差分方程,S平面到Z平面的映射,双线性变换法,频谱周期延拓效应","关键字",MessageBox.OK+MessageBox.ICONINFORMATION);
}
private void menuItem13_click(Object source, Event e)//参考文献
{
MessageBox.show("【1】王世一编著,数字信号处理(修订版),北京理工大学出版社 1997"+'\n'+"【2】郑君里等编著,信号与系统(第二版)下册,高等教育出版社 2000"+'\n'+"【3】梁昆淼编,刘法、缪国庆修订,数学物理方法(第三版),高等教育出版社 1995"+'\n'+"【4】浙江大学皱伯敏编,自动控制理论,机械工业出版社 1998","参考文献",MessageBox.OK+MessageBox.ICONINFORMATION);
}
private void menuItem14_click(Object source, Event e)//关于作者
{
new aboutme().showDialog(this);
}
private void menuItem2_click(Object source, Event e)//初始化滤波器
{ int rankx;//备用,存储计算出来的阶数如果合格就赋值给rank
double Qcx;
this.myframe.label3.setText("通带范围内幅度起伏小于");
int result=myframe.showDialog(this);
if(result==DialogResult.OK){//确认后根据设置的值求出数字滤波器的阶数和截至频率
double w1=0.01*myframe.trackBar1.getValue()*Math.PI;
double w2=0.01*myframe.trackBar3.getValue()*Math.PI;
double a=0.1*myframe.trackBar2.getValue();
double b=0.1*myframe.trackBar4.getValue();
Qcx=2*Math.tan(w1/2);
omiga=Math.sqrt(Math.pow(10,a/10)-1);
double nn=this.arch(Math.sqrt(Math.pow(10,b/10)-1)/omiga)/this.arch(Math.tan(w2/2)/Math.tan(w1/2));
//System.out.println(nn);
double nnn=nn;
int nnnn=(int)nnn;
double nnnnn=nnnn;
if(nnnnn-nn==0)rankx=(int)nn;
else rankx=(int)(nn+1);
//rankx=20;
//System.out.println("取整="+rankx+"");
//System.out.println(Qcx);
if(rankx>rankMAX||rankx<2){//阶数是有限制的
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -