Проблема была в том что нужно было использовать функции аргумента, а не арктангенса, а так же фильтровать спектр от зеркальной составляющей, занулив ее и удвоив исходный спектр
Может кому пригодится исходный код на java. Все это будет интегрироваться в Embedded систему с linux ядром.
Код
private static void DFT(double[] signal, double[] phase)
{
double[] Re = new double[1024];
double[] Im = new double[1024];
for(int k = 0; k < 1024; k++)
{
for(int n = 0; n < 1024; n++)
{
Re[k]=Re[k]+signal[n]*Math.cos(-2*Math.PI*k*n/1024 );
Im[k]=Im[k]+signal[n]*Math.sin(-2*Math.PI*k*n/1024 );
}
}
for(int k = 0; k < 1024; k++)
{
signal[k]=2*Math.sqrt(Re[k]*Re[k]+Im[k]*Im[k]);
phase[k]=Math.atan2(Im[k],Re[k]);
}
for(int n = 512; n < 1024; n++)
{
signal[n]=0;
phase[n]=0;
}
}
private static void ODFT(double[] signal, double[] phase)
{
double[] Re = new double[1024];
double[] Im = new double[1024];
for(int n = 0; n < 1024; n++)
{
Re[n]=signal[n]*Math.cos(phase[n]);
Im[n]=signal[n]*Math.sin(phase[n]);
}
for(int n = 0; n < 1024; n++)
{
signal[n]=0;
phase[n]=0;
for(int k = 0; k < 1024; k++)
{
signal[n]=signal[n]+Re[k]*Math.cos(2*Math.PI*k*n/1024)-Im[k]*Math.sin(2*Math.PI*k*n/1024);
}
}
for(int n = 0; n < 1024; n++)
{
signal[n]=signal[n]/1024;
}
}
Сообщение отредактировал Navstar - Sep 18 2013, 11:49