Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > ДПФ и построение спектрограммы


Автор: nerig 28.6.2012, 07:53
Всем доброго дня! smile 
Нужна небольшая помощь или пример. 
Как правильно реализовать дискретное преобразование фурье?  А то все борюсь, строю спектограмму, но получается откровенная чушь. Есть ли у кого нибудь пример?

Автор: borisbn 28.6.2012, 09:52
nerig, 
1) какой сигнал на входе - вещественный или комплексный ?
2) покажи свою функцию DFT
3) покажи, что ты подаёшь на график

Автор: nerig 4.7.2012, 05:24
borisbn, 
сейчас начал использовать вот этот код. Вроде работает, но почему то если в массиве больше 128 значений, вылетает с ошибкой.
Код

int nn, ii, jj, n, mmax, m, j, istep, i, isign;
double wtemp, wr, wpr, wpi, wi, theta, tempr, tempi;
nn = Memo1->Lines->Count;
double* a = new double[nn];
for (int i=0; i<Memo1->Lines->Count; i++)
        {
        a[i] = StrToFloat(Memo1->Lines->Strings[i]);
        }


n = 2*nn;
j = 1;
ii=1;
while (ii<=nn)
        {
        i = 2*ii-1;
        if (j>i)
                {
                tempr = a[j-1];
                tempi = a[j];
                a[j-1] = a[i-1];
                a[j] = a[i];
                a[i-1] = tempr;
                a[i] = tempi;
                }
        m = n/2;
        while (m>=2 && j>m)
                {
                j = j-m;
                m = m/2;
                }
        j = j+m;
        ii=ii+1;
    }
    mmax = 2;
    while (n>mmax)
    {
        istep = 2*mmax;
        theta = 2*M_PI/(isign*mmax);
        wpr = -2.0*(sin(0.5*theta))*(sin(0.5*theta));
        wpi = sin(theta);
        wr = 1.0;
        wi = 0.0;
        ii=1;
        while (ii<=mmax/2)
        {
            m = 2*ii-1;
            jj=0;
            while (jj<=(n-m)/istep)
            {
                i = m+jj*istep;
                j = i+mmax;
                tempr = wr*a[j-1]-wi*a[j];
                tempi = wr*a[j]+wi*a[j-1];
                a[j-1] = a[i-1]-tempr;
                a[j] = a[i]-tempi;
                a[i-1] = a[i-1]+tempr;
                a[i] = a[i]+tempi;
                jj=jj+1;
            }
            wtemp = wr;
            wr = wr*wpr-wi*wpi+wr;
            wi = wi*wpr+wtemp*wpi+wi;
            ii=ii+1;
        }
        mmax = istep;
    }
  for (int i=0; i<nn; i++)
        {
        Memo2->Lines->Add(FloatToStr(a[i]));
        Form2->Series1->Add(a[i],2,Color1);
        }
delete(a);

Автор: ksili 4.7.2012, 06:32
а где nn инициализируется?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)