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 + -
显示快捷键?