dft.java

来自「很好的播放软件可以用FFT算法计算波形 有点像media9 不过完整程序有两个部」· Java 代码 · 共 73 行

JAVA
73
字号
//DFT算法

public class DFT
{
	//data为被采样的信号数据
	private int[] data;
	//n为采样点个数
	private int n;
	//sampleData为n个采样值
	private int[] sampleData;
	//xk为复数xn经过DFT算法后获得的转换值
	private Complex[] xk,xn; 
	
	public DFT(int[] data,int n)
	{
		this.data=data;
		this.n=n;
		sampleData=new int[n];
		xn=new Complex[n];
		xk=new Complex[n];
		setSampleData();
	}
	
	public void setSampleData(int[] data)
	{
		this.data=data;
	}
	public void setSampleNumber(int n)
	{
		this.n=n;
	}
	
	//获得sampleData
	private void setSampleData()
	{
		//获得n个采样点值,并将其赋到sampleData数组里
		int number=(int)(data.length/n);
		for(int i=0;i<n;i++)
		{
			sampleData[i]=data[i*number];
		}
	}
	//DFT算法
	public double[] getDFT()
	{
		double[] result=new double[n/2];
		//初始化xn,xk
		for(int i=0;i<n;i++)
		{
			xn[i]=new Complex(sampleData[i],0);
			xk[i]=new Complex();
			//System.out.println(xn[i]);
		}
		//DFT运算
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				Complex emk=new Complex(Math.cos(-2*Math.PI*i*j/n),Math.sin(-2*Math.PI*i*j/n));
				xk[i]=xk[i].add(xn[j].multiply(emk));
			}
			//System.out.println("xk"+i+"="+xk[i]);
		}
		//求xk的模并将其返回result数组;
		for(int i=0;i<n/2;i++)
		{
			result[i]=Math.log(xk[i].getModel())/Math.log(10)*20;
		}
		
		return result;		
	}
	
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?