Приветствую участников форума!
Есть проблема - результаты БПФ и прямого преобразования совершенно не похожи друг на друга, при этом прямое преобразование выглядит верным, а в быстром появляются лишние гармоники, и уровень основных не соответствует действительному. Для того, чтобы разобраться в этом, я написал тривиальное преобразование при 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)