Приветствую участников форума!
Есть проблема - результаты БПФ и прямого преобразования совершенно не похожи друг на друга, при этом прямое преобразование выглядит верным, а в быстром появляются лишние гармоники, и уровень основных не соответствует действительному. Для того, чтобы разобраться в этом, я написал тривиальное преобразование при N=8 без использования циклов и каких-либо алгоритмов, просто написав весь код построчно, используя формулы из статьи о БПФ с прореживанием по времени. Даже все обозначения оставил как в статье. Вот часть кода быстрого преобразования:
//заполнение входного массива
for(int i=0;i<8;i++)
s[i].Re=60*sin(0.75*M_PI*i);
for(int i=0;i<8;i++)
s[i].Im=0.0;
//first step
S00[0]=s[0]+s[4];
S00[1]=s[0]-s[4];
S01[0]=s[2]+s[6];
S01[1]=s[2]-s[6];
S10[0]=s[1]+s[5];
S10[1]=s[1]-s[5];
S11[0]=s[3]+s[7];
S11[1]=s[3]-s[7];
//second step
complex W14;
W14.Re=0.0; W14.Im=-1.0;
S0[0]=S00[0]+S01[0];
S0[1]=S00[1]+W14*S01[1];
S0[2]=S00[0]-S01[0];
S0[3]=S00[1]-W14*S01[1];
S1[0]=S10[0]+S11[0];
S1[1]=S10[1]+W14*S11[1];
S1[2]=S10[0]-S11[0];
S1[3]=S10[1]-W14*S11[1];
//third step - final
complex W18,W38;
W18.Re=cos(-M_PI*0.25); W18.Im=sin(-M_PI*0.25); W38.Re=cos(-M_PI*0.75); W38.Im=sin(-M_PI*0.75);
S[0]=S0[0]+S1[0];
S[1]=S0[1]+W18*S1[1];
S[2]=S0[2]+W14*S1[2];
S[3]=S0[3]+W38*S1[3];
S[4]=S0[0]-S1[0];
S[5]=S0[1]-W18*S1[1];
S[6]=S0[2]-W14*S1[2];
S[7]=S0[3]-W38*S1[3];
//вывод значений Re и Im в таблицу
for(int i=0;i<8;i++)
{
StringGrid1->Cells[0][i]=S[i].Re;
StringGrid1->Cells[1][i]=S[i].Im;
}
//вычисление амплитуды гармоник
for(int i=0;i<8;i++)
g[i]=S[i].ABS()/4.0;
//вывод значений амплитуд
for(int i=0;i<8;i++)
{
StringGrid1->Cells[2][i]=g[i];
}
ProgressBar1->Position=g[0];
ProgressBar2->Position=g[1];
ProgressBar3->Position=g[2];
ProgressBar4->Position=g[3];
ProgressBar5->Position=g[4];
ProgressBar6->Position=g[5];
ProgressBar7->Position=g[6];
ProgressBar8->Position=g[7];
}Вот такой вот китайский код
А вот код прямого преобразования:
//заполнение входного массива
for(int i=0;i<8;i++)
s[i].Re=60*sin(0.75*M_PI*i);
for(int i=0;i<8;i++)
s[i].Im=0.0;
//главный цикл
for(int gar=0;gar<8;gar++)
{
out[gar].Re=0.0;
out[gar].Im=0.0;
for(int inp=0;inp<8;inp++)
{
complex W;
W.Re=cos(-M_PI*gar*inp/4.0);
W.Im=sin(-M_PI*gar*inp/4.0);
out[gar]=out[gar]+s[inp]*W;
}
}
//вывод значений Re и Im в таблицу
for(int i=0;i<8;i++)
{
StringGrid1->Cells[3][i]=out[i].Re;
StringGrid1->Cells[4][i]=out[i].Im;
}
//вычисление амплитуды гармоник
for(int i=0;i<8;i++)
g2[i]=out[i].ABS()/4.0;
//вывод значений амплитуд
for(int i=0;i<8;i++)
{
StringGrid1->Cells[5][i]=g2[i];
}
ProgressBar1->Position=g2[0];
ProgressBar2->Position=g2[1];
ProgressBar3->Position=g2[2];
ProgressBar4->Position=g2[3];
ProgressBar5->Position=g2[4];
ProgressBar6->Position=g2[5];
ProgressBar7->Position=g2[6];
ProgressBar8->Position=g2[7];Отредактировано YurOK (2010-07-16 15:39:50)



