⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.java

📁 切比雪夫滤波器设计,JAVA编写,VJ编译
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
	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 + -