Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Общетехнические вопросы

Общетехнические вопросы Общие вопросы аналоговой и цифровой электроники.

Ответ
 
Опции темы Опции просмотра
Старый 25.04.2014, 22:08   #1
f3434
Junior Member
 
Регистрация: 01.11.2011
Возраст: 41
Сообщений: 27
Вес репутации: 100/31
f3434 will become famous soon enoughf3434 will become famous soon enough
Cool Быстрое преобразование Фурье. Метод разложения на множители.

PHP код:
#include "math.h"
#include <map>
#include <vector>


#define M_PI       3.14159265358979323846



class ShortComplex2
{
public:
    
double reim

    
ShortComplex2() { re 0im 0; }
    
ShortComplex2( const ShortComplex2co ) { re co.reim co.im; }
    
ShortComplex2double re_double im_ ) { re re_im im_; }
    
ShortComplex2operator=( const ShortComplex2co ) { re co.reim co.im; return *this; }
    
ShortComplex2operator+=( const ShortComplex2co ) { re += co.reim += co.im; return *this; }
    
ShortComplex2  operator+( const ShortComplex2co ) { ShortComplex2 co2re co.reim co.im ); return co2; }
    
ShortComplex2  operator-( const ShortComplex2co ) { ShortComplex2 co2re co.reim co.im ); return co2; }
    
ShortComplex2  operator*( const ShortComplex2co ) { ShortComplex2 co2re co.re im co.imre co.im im co.re ); return co2; }
};




void DPFShortComplex2 *pCoInShortComplex2 *pCoOutint Sizebool bDir )
{
    
ShortComplex2 c1;
    
double d2 2. M_PI Sized3;
    
int ik;

    if( 
Size )
        return;

    if( 
bDir d2 = - d2;

    for( 
0Sizek++ )
    {
        
ShortComplex2 pCoRez pCoOut];
        
pCoRez pCoIn];

        for( 
1Sizei++ )
        {
            
d3 d2;
            
c1.re cosd3 );
            
c1.im sind3 );
            
pCoRez.re += ( c1.re pCoIn].re c1.im pCoIn].im );
            
pCoRez.im += ( c1.re pCoIn].im c1.im pCoIn].re );
        }
    }

    if( 
bDir == )
    {
        for( 
0Sizek++ )
        {
            
pCoOut].re /= Size;
            
pCoOut].im /= Size;
        }
    }
}



void CheckSmplNumbsstd::vector<size_t> &vSmplNumsize_t UpLevel )
{
    
size_t ik;

    if( 
vSmplNum.empty() )
    {
        
vSmplNum.reserve64 );
        
vSmplNum.resize);
        
vSmplNum] = 2;
        
vSmplNum] = 3;
        
vSmplNum] = 5;
    }

    for( 
vSmplNum.back() + 2; ; += )
    {
        for( 
0; ; i++ )
        {
            if( 
>= vSmplNum.size() )
            {
                
vSmplNum.push_back);
                if( 
UpLevel )
                    return;
                break;
            }
            if( ( 
vSmplNum] ) == )
                break;
        }
    }
}


size_t DecomposeNumsize_t uVstd::vector<size_t> &vSmplM )
{
    static 
std::vector<size_tvSmplNum;
    static 
std::mapsize_tstd::vector<size_t> > mpSmplNum;
    
std::vector<size_t> & vSmplNum2 mpSmplNumuV ];
    
std::map<size_t,size_tmp;
    
size_t i0;

    if( 
vSmplNum2.size() )
    {
        
vSmplM vSmplNum2;
        return 
i;
    }

    
CheckSmplNumbsvSmplNumuV );

m_begin:;

    for( 
0; ; i++ )
    {
        if( 
uV == vSmplNum] )
        {
            
mpvSmplNum] ] ++;
            
++;
            goto 
m_end;
        }
        if( ( 
uV vSmplNum] ) == )
        {
            
mpvSmplNum] ] ++;
            
uV /= vSmplNum];
            
++;
            goto 
m_begin;
        }
    }

m_end:;

    
vSmplM.resize);
    
0;

    for( 
std::map<size_t,size_t>::reverse_iterator P mp.rbegin(); != mp.rend(); P++ )
    {
        for( 
0P->secondj++ ) 
            
vSmplMi++ ] = P->first;
    }

    
vSmplNum2 vSmplM;

    return 
i;
}


void GNextint Nint ppPredint pLastShortComplex2 *pF1ShortComplex2 *pF2std::vector<ShortComplex2> &vW )
{
    
int N2np2l1N3kk2l2

    
p2 ppPred pLast;
    
N2 ppPred;
    
N3 p2;

    for( 
0N2n++ )
    {
        
= ( N3 ) * p2;
        for( 
l1 0l1 ppPredl1++ )
        {
            
ShortComplex2 pCoRez pF1ppPred l1 ]; 
            
pCoRez pF2k2 l1 ];
            for( 
l2 1k2 += ppPredl2 pLastl2++, k2 += ppPred )
                
pCoRez += pF2k2 ] * vW[ ( ppPred l2 ) % ];
        }
    }
}



void SmpNm_FFTShortComplex2 *pCoInShortComplex2 *pCoOutShortComplex2 *pBufSizeint Sizebool bDir )
{
    
std::map<int,std::vector<ShortComplex2>> mpW;
    
std::vector<size_tvSmplM;
    
ShortComplex2 *pBuf];
    
int ppPredp2i;

    if( 
Size )
        return;

    
std::vector<ShortComplex2> &vW mpWSize ];
    if( 
vW.size() < Size )
    {
        
double d;
        
vW.resizeSize );
        for( 
0Sizei++ )
        {
            
= - M_PI * ( ) / Size;
            
vW].re cos);
            
vW].im sin);
        }
    }

    
DecomposeNumSizevSmplM );

    
vSmplM.size() - 1;
    
p2 vSmplM];
    
ppPred Size p2;

    if( 
bDir )
    { 
        
pBuf] = pCoOut
        
pBuf] = pBufSize
        
GNextSizeppPredp2pBuf], pCoInvW );
    }
    else
    {
        
pBuf] = pBufSize
        
pBuf] = pCoOut
        
ShortComplex2 *pBuf2 pBuf[ ( ) & ];
        for( 
int j 0Sizej++ ) { pBuf2].re pCoIn].repBuf2].im = - pCoIn].im; }
        
GNextSizeppPredp2pBuf], pBuf2vW );
    }

    while( 
i-- > )
    {
        
p2 vSmplM];
        
ppPred /= p2;
        
GNextSizeppPredp2pBuf], pBuf[ ( ) & ], vW );
    }

    if( ! 
bDir )
    {
        for( 
int j 0Sizej++ ) { pCoOut].re pBufSize].re SizepCoOut].im = - pBufSize].im Size; }
    }
}




int _tmain(int argc_TCHARargv[])
{
    
ShortComplex2 dSpec[2048], dSpec2[2048], dSpec3[2048], dSpecNew2[2048], dSpecNew2Buf[2048], dSpecNew3[2048]; 
    
DWORD    dw1 0dw2 0;
    
double    dF1DTb;
    
int        ijsz;



    
ZeroMemory(dSpec,sizeof(dSpec));
    
ZeroMemory(dSpec2,sizeof(dSpec2));
    
ZeroMemory(dSpec3,sizeof(dSpec3));
    
ZeroMemory(dSpecNew2,sizeof(dSpecNew2));
    
ZeroMemory(dSpecNew2Buf,sizeof(dSpecNew2Buf));
    
ZeroMemory(dSpecNew3,sizeof(dSpecNew2Buf));


#if 0
    
sz 15// 7 * 11;
    
DT 1. 4000.
    
dF1 1. / ( sz DT );
    
1. DT;

    
double f1 500f2 1500A1 1A2 2;
    
double w1 2*M_PI*f1*DT;                      // Угловые частоты
    
double w2 2*M_PI*f2*DT;

    for( 
0szi++ ) 
    {
        
dSpec].re A1*cos(w1*i+M_PI/4.)+A2*cos(w2*i+M_PI/8.); 
    }
#endif

    
sz    1722// 1025; // 7 * 11;
    
DT    1. 200
    
dF1 1. / ( sz DT );
    
b    1. DT;

    
double f1 2f2 4A1 1A2 2;
    
double w1 2*M_PI*f1*DT;                      // Угловые частоты
    
double w2 2*M_PI*f2*DT;

    for( 
0szi++ ) 
    {
        
dSpec].re A1*cos(w1*i+M_PI/4.)+A2*cos(w2*i+M_PI/8.); 
    }



    
dw1 GetTickCount();

    
SmpNm_FFTdSpecdSpecNew2dSpecNew2Bufsztrue );
    for( 
0szi++ ) 
    {
        
dSpecNew2].re *= DT;
        
dSpecNew2].im *= DT;
    }

    
SmpNm_FFTdSpecNew2dSpecNew3dSpecNew2Bufszfalse );
    for( 
0szi++ ) 
    {
        
dSpecNew3].re *= b;
        
dSpecNew3].im *= b;
    }

    
dw1 GetTickCount() - dw1;


    
printf"\n\n\n******************************************************\n\n\n");

    
dw2 GetTickCount();

    
DPFdSpecdSpec2sztrue );
    for( 
0szi++ ) 
    {
        
dSpec2].re *= DT;
        
dSpec2].im *= DT;
    }

    
DPFdSpec2dSpec3szfalse );
    for( 
0szi++ ) 
    {
        
dSpec3].re *= b;
        
dSpec3].im *= b;
    }


    
dw2 GetTickCount() - dw2;

    for( 
0szi++ ) 
        
printf"\n %3i.  %8.10lf -> : %8.5lf : [%8.5lf,%8.5lf] -> %8.10lf, %8.5lf  -|-  [%8.5lf,%8.5lf] -> %8.10lf, %8.5lf"
        
1dSpec].redF1 idSpec2].redSpec2].imdSpec3].redSpec3].imdSpecNew2].redSpecNew2].imdSpecNew3].redSpecNew3].im );


    
printf("\n\n Time: %u - %u"dw1dw2 );

    
scanf("%i",&i);
    return 
0;

Вложения
Тип файла: zip Furie.zip (2.2 Кб, 7 просмотров)
f3434 вне форума   Ответить с цитированием
Старый 26.04.2014, 11:06   #2
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 46
Сообщений: 1,685
Вес репутации: 2423/83
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Ну а вопрос-то в чем?
DimaS вне форума   Ответить с цитированием
Старый 26.04.2014, 14:45   #3
f3434
Junior Member
 
Регистрация: 01.11.2011
Возраст: 41
Сообщений: 27
Вес репутации: 100/31
f3434 will become famous soon enoughf3434 will become famous soon enough
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Во-первых, это написанный код. Кому надо, можно не терять время, а просто взять.

Во-вторых, может кто-нибудь подскажет, как можно прооптимизировать программу, чтобы ещё быстрее работало.
f3434 вне форума   Ответить с цитированием
Старый 26.04.2014, 18:01   #4
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 46
Сообщений: 1,685
Вес репутации: 2423/83
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Кому надо, можно не терять время, а просто взять.
На PHP? Думаю тут таких не много.
DimaS вне форума   Ответить с цитированием
Старый 27.04.2014, 04:51   #5
sleepwalker
Banned
 
Регистрация: 20.04.2014
Возраст: 49
Сообщений: 30
Вес репутации: 105/0
sleepwalker will become famous soon enoughsleepwalker will become famous soon enough
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от DimaS Посмотреть сообщение
На PHP? Думаю тут таких не много.
Обычный С++. Заменить printf на cout, так любой компилятор, наверное, проглотит.
sleepwalker вне форума   Ответить с цитированием
Старый 27.04.2014, 10:17   #6
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,721
Вес репутации: 4545/132
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от f3434 Посмотреть сообщение
Во-первых, это написанный код. Кому надо, можно не терять время, а просто взять.

Во-вторых, может кто-нибудь подскажет, как можно прооптимизировать программу, чтобы ещё быстрее работало.
А зачем все эти глубокие теоретические исследования для неизвестного целевого устройства? Как пример кода - плохой пример и брать тут нечего (код без описания и комментариев). В свободном доступе есть оптимизированные по скорости примеры (это кому скорость важна) с результатами тестов.

А так, например, для практического использования, для STM32 есть готовые понятные примеры, оптимизированные для конкретной архитектуры. А у вас просьба оптимизировать "чтобы ещё быстрее работало".
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 27.04.2014, 12:28   #7
f3434
Junior Member
 
Регистрация: 01.11.2011
Возраст: 41
Сообщений: 27
Вес репутации: 100/31
f3434 will become famous soon enoughf3434 will become famous soon enough
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

А дайте, pliz, ссылку на примеры к stm32.
Комментарии добавил.
f3434 вне форума   Ответить с цитированием
Старый 27.04.2014, 12:30   #8
f3434
Junior Member
 
Регистрация: 01.11.2011
Возраст: 41
Сообщений: 27
Вес репутации: 100/31
f3434 will become famous soon enoughf3434 will become famous soon enough
Cool Re: Быстрое преобразование Фурье. Метод разложения на множители.

Код:

#include "math.h"
#include <map>
#include <vector>


#define M_PI       3.14159265358979323846



class ShortComplex2
{
public:
    double re, im; 

    ShortComplex2() { re = 0; im = 0; }
    ShortComplex2( const ShortComplex2& co ) { re = co.re; im = co.im; }
    ShortComplex2( double re_, double im_ ) { re = re_; im = im_; }
    ShortComplex2& operator=( const ShortComplex2& co ) { re = co.re; im = co.im; return *this; }
    ShortComplex2& operator+=( const ShortComplex2& co ) { re += co.re; im += co.im; return *this; }
    ShortComplex2  operator+( const ShortComplex2& co ) { ShortComplex2 co2( re + co.re, im + co.im ); return co2; }
    ShortComplex2  operator-( const ShortComplex2& co ) { ShortComplex2 co2( re - co.re, im - co.im ); return co2; }
    ShortComplex2  operator*( const ShortComplex2& co ) { ShortComplex2 co2( re * co.re - im * co.im, re * co.im + im * co.re ); return co2; }
};


/*
 * Быстрое преобразование Фурье. Метод разложения на простые множители.
 *
 *    pCoIn    - Массив (указатель) исходной последовательности
 *     pCoOut   - Массив (указатель) для результата
 *     pBufSize - Массив (указатель) для работы метода длины Size.
 *     Size     - Размер последовательности
 *     bDir     - true: для прямого преобразования,  false: для обратного преобразования
*/
void SmpNm_FFT( ShortComplex2 *pCoIn, ShortComplex2 *pCoOut, ShortComplex2 *pBufSize, int Size, bool bDir );

/*
 * Обычное дискретное преобразование Фурье
*/
void DPF( ShortComplex2 *pCoIn, ShortComplex2 *pCoOut, int Size, bool bDir );

/*
 * Пример программы с тестом и сравнением с обычным ДПФ
*/
int _tmain(int argc, _TCHAR* argv[]);



/*
 * строит вектор простых чисел до данного числа
*/
void CheckSmplNumbs( std::vector<size_t> &vSmplNum, size_t UpLevel );
/*
 * Раскладывает число на простые множители
*/
size_t DecomposeNum( size_t uV, std::vector<size_t> &vSmplM );
/*
 * Рабочая функция для БПФ
*/
void GNext( int N, int ppPred, int pLast, ShortComplex2 *pF1, ShortComplex2 *pF2, std::vector<ShortComplex2> &vW );








void DPF( ShortComplex2 *pCoIn, ShortComplex2 *pCoOut, int Size, bool bDir )
{
    ShortComplex2 c1;
    double d2 = 2. * M_PI / Size, d3;
    int i, k;

    if( Size < 1 )
        return;

    if( bDir ) d2 = - d2;

    for( k = 0; k < Size; k++ )
    {
        ShortComplex2 & pCoRez = pCoOut[ k ];
        pCoRez = pCoIn[ 0 ];

        for( i = 1; i < Size; i++ )
        {
            d3 = k * i * d2;
            c1.re = cos( d3 );
            c1.im = sin( d3 );
            pCoRez.re += ( c1.re * pCoIn[ i ].re - c1.im * pCoIn[ i ].im );
            pCoRez.im += ( c1.re * pCoIn[ i ].im + c1.im * pCoIn[ i ].re );
        }
    }

    if( bDir == 0 )
    {
        for( k = 0; k < Size; k++ )
        {
            pCoOut[ k ].re /= Size;
            pCoOut[ k ].im /= Size;
        }
    }
}



void CheckSmplNumbs( std::vector<size_t> &vSmplNum, size_t UpLevel )
{
    size_t i, k;

    if( vSmplNum.empty() )
    {
        vSmplNum.reserve( 64 );
        vSmplNum.resize( 3 );
        vSmplNum[ 0 ] = 2;
        vSmplNum[ 1 ] = 3;
        vSmplNum[ 2 ] = 5;
    }

    for( k = vSmplNum.back() + 2; ; k += 2 )
    {
        for( i = 0; ; i++ )
        {
            if( i >= vSmplNum.size() )
            {
                vSmplNum.push_back( k );
                if( k > UpLevel )
                    return;
                break;
            }
            if( ( k % vSmplNum[ i ] ) == 0 )
                break;
        }
    }
}


size_t DecomposeNum( size_t uV, std::vector<size_t> &vSmplM )
{
    static std::vector<size_t> vSmplNum;
    static std::map< size_t, std::vector<size_t> > mpSmplNum;
    std::vector<size_t> & vSmplNum2 = mpSmplNum[ uV ];
    std::map<size_t,size_t> mp;
    size_t i, j = 0;

    if( i = vSmplNum2.size() )
    {
        vSmplM = vSmplNum2;
        return i;
    }

    CheckSmplNumbs( vSmplNum, uV );

m_begin:;

    for( i = 0; ; i++ )
    {
        if( uV == vSmplNum[ i ] )
        {
            mp[ vSmplNum[ i ] ] ++;
            j ++;
            goto m_end;
        }
        if( ( uV % vSmplNum[ i ] ) == 0 )
        {
            mp[ vSmplNum[ i ] ] ++;
            uV /= vSmplNum[ i ];
            j ++;
            goto m_begin;
        }
    }

m_end:;

    vSmplM.resize( j );
    i = 0;

    for( std::map<size_t,size_t>::reverse_iterator P = mp.rbegin(); P != mp.rend(); P++ )
    {
        for( j = 0; j < P->second; j++ ) 
            vSmplM[ i++ ] = P->first;
    }

    vSmplNum2 = vSmplM;

    return i;
}


void GNext( int N, int ppPred, int pLast, ShortComplex2 *pF1, ShortComplex2 *pF2, std::vector<ShortComplex2> &vW )
{
    int N2, n, p2, l1, N3, k, k2, l2; 

    p2 = ppPred * pLast;
    N2 = N / ppPred;
    N3 = N / p2;

    for( n = 0; n < N2; n++ )
    {
        k = ( n % N3 ) * p2;
        for( l1 = 0; l1 < ppPred; l1++ )
        {
            ShortComplex2 & pCoRez = pF1[ ppPred * n + l1 ]; 
            pCoRez = pF2[ k2 = k + l1 ];
            for( l2 = 1, k2 += ppPred; l2 < pLast; l2++, k2 += ppPred )
                pCoRez += pF2[ k2 ] * vW[ ( n * ppPred * l2 ) % N ];
        }
    }
}



void SmpNm_FFT( ShortComplex2 *pCoIn, ShortComplex2 *pCoOut, ShortComplex2 *pBufSize, int Size, bool bDir )
{
    std::map<int,std::vector<ShortComplex2>> mpW;
    std::vector<size_t> vSmplM;
    ShortComplex2 *pBuf[ 2 ];
    int ppPred, p2, i;

    if( Size < 2 )
        return;

    std::vector<ShortComplex2> &vW = mpW[ Size ];
    if( vW.size() < (size_t)Size )
    {
        double d;
        vW.resize( Size );
        for( i = 0; i < Size; i++ )
        {
            d = - M_PI * ( 2 * i ) / Size;
            vW[ i ].re = cos( d );
            vW[ i ].im = sin( d );
        }
    }

    DecomposeNum( Size, vSmplM );

    i = vSmplM.size() - 1;
    p2 = vSmplM[ i ];
    ppPred = Size / p2;

    if( bDir )
    { 
        pBuf[ 0 ] = pCoOut; 
        pBuf[ 1 ] = pBufSize; 
        GNext( Size, ppPred, p2, pBuf[ i & 1 ], pCoIn, vW );
    }
    else
    {
        pBuf[ 0 ] = pBufSize; 
        pBuf[ 1 ] = pCoOut; 
        ShortComplex2 *pBuf2 = pBuf[ ( i + 1 ) & 1 ];
        for( int j = 0; j < Size; j++ ) { pBuf2[ j ].re = pCoIn[ j ].re; pBuf2[ j ].im = - pCoIn[ j ].im; }
        GNext( Size, ppPred, p2, pBuf[ i & 1 ], pBuf2, vW );
    }

    while( i-- > 0 )
    {
        p2 = vSmplM[ i ];
        ppPred /= p2;
        GNext( Size, ppPred, p2, pBuf[ i & 1 ], pBuf[ ( i + 1 ) & 1 ], vW );
    }

    if( ! bDir )
    {
        for( int j = 0; j < Size; j++ ) { pCoOut[ j ].re = pBufSize[ j ].re / Size; pCoOut[ j ].im = - pBufSize[ j ].im / Size; }
    }
}




int _tmain(int argc, _TCHAR* argv[])
{
    ShortComplex2 dSpec[2048], dSpec2[2048], dSpec3[2048], dSpecNew2[2048], dSpecNew2Buf[2048], dSpecNew3[2048]; 
    DWORD    dw1 = 0, dw2 = 0;
    double    dF1, DT, b;
    int        i, sz;



    ZeroMemory(dSpec,sizeof(dSpec));
    ZeroMemory(dSpec2,sizeof(dSpec2));
    ZeroMemory(dSpec3,sizeof(dSpec3));
    ZeroMemory(dSpecNew2,sizeof(dSpecNew2));
    ZeroMemory(dSpecNew2Buf,sizeof(dSpecNew2Buf));
    ZeroMemory(dSpecNew3,sizeof(dSpecNew2Buf));


#if 0
    sz = 15; // 7 * 11;
    DT = 1. / 4000.; 
    dF1 = 1. / ( sz * DT );
    b = 1. / DT;

    double f1 = 500, f2 = 1500, A1 = 1, A2 = 2;
    double w1 = 2*M_PI*f1*DT;                      // Угловые частоты
    double w2 = 2*M_PI*f2*DT;

    for( i = 0; i < sz; i++ ) 
    {
        dSpec[ i ].re = A1*cos(w1*i+M_PI/4.)+A2*cos(w2*i+M_PI/8.); 
    }
#endif

    sz    = 1722; // 1025; // 7 * 11;
    DT    = 1. / 200; 
    dF1 = 1. / ( sz * DT );
    b    = 1. / DT;

    double f1 = 2, f2 = 4, A1 = 1, A2 = 2;
    double w1 = 2*M_PI*f1*DT;                      // Угловые частоты
    double w2 = 2*M_PI*f2*DT;

    for( i = 0; i < sz; i++ ) 
    {
        dSpec[ i ].re = A1*cos(w1*i+M_PI/4.)+A2*cos(w2*i+M_PI/8.); 
    }



    dw1 = GetTickCount();

    SmpNm_FFT( dSpec, dSpecNew2, dSpecNew2Buf, sz, true );
    for( i = 0; i < sz; i++ ) 
    {
        dSpecNew2[ i ].re *= DT;
        dSpecNew2[ i ].im *= DT;
    }

    SmpNm_FFT( dSpecNew2, dSpecNew3, dSpecNew2Buf, sz, false );
    for( i = 0; i < sz; i++ ) 
    {
        dSpecNew3[ i ].re *= b;
        dSpecNew3[ i ].im *= b;
    }

    dw1 = GetTickCount() - dw1;


    printf( "\n\n\n******************************************************\n\n\n");

    dw2 = GetTickCount();

    DPF( dSpec, dSpec2, sz, true );
    for( i = 0; i < sz; i++ ) 
    {
        dSpec2[ i ].re *= DT;
        dSpec2[ i ].im *= DT;
    }

    DPF( dSpec2, dSpec3, sz, false );
    for( i = 0; i < sz; i++ ) 
    {
        dSpec3[ i ].re *= b;
        dSpec3[ i ].im *= b;
    }


    dw2 = GetTickCount() - dw2;

    for( i = 0; i < sz; i++ ) 
        printf( "\n %3i.  %8.10lf -> : %8.5lf : [%8.5lf,%8.5lf] -> %8.10lf, %8.5lf  -|-  [%8.5lf,%8.5lf] -> %8.10lf, %8.5lf", 
        i + 1, dSpec[ i ].re, dF1 * i, dSpec2[ i ].re, dSpec2[ i ].im, dSpec3[ i ].re, dSpec3[ i ].im, dSpecNew2[ i ].re, dSpecNew2[ i ].im, dSpecNew3[ i ].re, dSpecNew3[ i ].im );


    printf("\n\n Time: %u - %u", dw1, dw2 );

    scanf("%i",&i);
    return 0;
}
Вложения
Тип файла: zip Furie.zip (2.6 Кб, 9 просмотров)
f3434 вне форума   Ответить с цитированием
Старый 27.04.2014, 12:44   #9
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,721
Вес репутации: 4545/132
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от f3434 Посмотреть сообщение
А дайте, pliz, ссылку на примеры к stm32.
CMSIS DSP Library.

Transform Functions

Там и примеры есть. Можете сравнить с вашим по стилистике, длине кода и уровнем погружения в FFT при использовании примера.
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 27.04.2014 в 12:50.
Pridnya вне форума   Ответить с цитированием
Старый 27.04.2014, 13:28   #10
f3434
Junior Member
 
Регистрация: 01.11.2011
Возраст: 41
Сообщений: 27
Вес репутации: 100/31
f3434 will become famous soon enoughf3434 will become famous soon enough
Cool Re: Быстрое преобразование Фурье. Метод разложения на множители.

Насколько я понял, у них длина последовательности - степень 2.
В обычных методах БПФ последовательность дополняется нулями до нужной длины. Это может вносить новые гармоники. Здесь реализован метод:
http://sonder.ru/content/view/480/32/
Это компромисный вариант.
f3434 вне форума   Ответить с цитированием
Старый 27.04.2014, 21:30   #11
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,721
Вес репутации: 4545/132
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от f3434 Посмотреть сообщение
Насколько я понял, у них длина последовательности - степень 2.
В обычных методах БПФ последовательность дополняется нулями до нужной длины. Это может вносить новые гармоники. Здесь реализован метод:
http://sonder.ru/content/view/480/32/
Это компромисный вариант.
Да, там степень 2. Про обычные методы можно не упоминать, Лучше уточнить в каком случае требуется дополнение и зачем.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 27.04.2014, 23:46   #12
f3434
Junior Member
 
Регистрация: 01.11.2011
Возраст: 41
Сообщений: 27
Вес репутации: 100/31
f3434 will become famous soon enoughf3434 will become famous soon enough
Cool Re: Быстрое преобразование Фурье. Метод разложения на множители.

Иногда важнее получить точный результат, работая с последовательностью в её исходном виде. Этот метод сочетает в себе точность Дискретного Преобразования Фурье и позволяет достичь высокой производительности в тех случаях, когда размер последовательности раскладывается на множители.
f3434 вне форума   Ответить с цитированием
Старый 28.04.2014, 13:17   #13
f3434
Junior Member
 
Регистрация: 01.11.2011
Возраст: 41
Сообщений: 27
Вес репутации: 100/31
f3434 will become famous soon enoughf3434 will become famous soon enough
Cool Re: Быстрое преобразование Фурье. Метод разложения на множители.

Собственно, при длине последовательности равной 2 в степени N этот метод превращается в обычный БПФ.
f3434 вне форума   Ответить с цитированием
Старый 02.10.2019, 14:02   #14
maagalex
Senior Member
 
Аватар для maagalex
 
Регистрация: 25.02.2007
Адрес: &Alex==Israel.BatYam
Возраст: 43
Сообщений: 4,455
Вес репутации: 2476/115
maagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond repute
Отправить сообщение для maagalex с помощью ICQ Отправить сообщение для maagalex с помощью MSN Отправить сообщение для maagalex с помощью Skype™
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Подниму тему, может кто укажет на ошибку..
Скачал я библиотеку преобразования фурье под 8 битные значения..
Входной массив int8 data[128]; //input data
Выходной массив int8 im[128]={0};
Записал на карту памяти файл sinus.wav с плавно нарастающей частотой от 100Гц до 5000Гц
Контроллер считывает 128 байт из файла, по таймеру с частотой 10кГц кидает эти значения в ШИМ и на осциллографе я вижу осциллограмму..
Дальше значения я кидаю в функцию преобразования фурье и уже выходной массив этой функции кидаю в ШИМ по таймеру..
Вместо спектра вижу какое то подобие цифрового сигнала..

Возможно проблема в формате входных данных?..У меня PCM из WAV файла, 0..255 где 128 это 0 сигнала, и соответственно 127 это минимальная амплитуда вниз, 129 вверх..Каков он должен быть для БПФ не знаю точно)
https://youtu.be/TL0fo5T1Fto
maagalex вне форума   Ответить с цитированием
Старый 02.10.2019, 21:38   #15
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,721
Вес репутации: 4545/132
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от maagalex Посмотреть сообщение
Подниму тему, может кто укажет на ошибку.
Скачал я библиотеку преобразования фурье под 8 битные значения.
Александр, я думаю, что на форуме не так много людей, которые вообще понимают о чем речь, тем более в таком сложном случае, когда начинающий решил овладеть основами цифровой обработки сигналов и при этом не знает теорию, не владеет терминологией. Лет 10 назад, когда я начинал, то начал с теории, с простого сишного кода и для случая Дискретного преобразования Фурье, вычислял каждую гармонику по отдельности. Понял смысл этого преобразования. Затем поискал библиотеки для Быстрого преобразования Фурье, но тогда оно мне не особо понадобилось, т.к. нужно было считать основную гармонику и первые нечетные 3, 5, 7,9. И только потом весь этот код переписал для микроконтроллера (тестировал в Борланд Турбо Си). И осциллограф у меня появился намного позже, спустя несколько лет после преобразования Фурье. А про форматы PCM и WAV я узнал еще позже, просто нужды не было знать про это. Фурье не знает про WAV, про PCM.

Ты должен ограничиться основными понятиями:
1) частота дискретизации;
2) разрядность данных (от АЦП);
3) размер массива данных;
4) алгоритм Быстрого преобразования Фурье;
5) спектр.
Можно еще про наложение спектра, антиалисинговый фильтр поговорить, критерий Найквиста, но это попозже, когда математически сможешь задать входной массив (сумму сигналов известных тебе частот) и увидеть в спектре свои сигналы, с известными тебе амплитудами. Успехов.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 03.10.2019, 00:29   #16
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 2,625
Вес репутации: 3663/107
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от maagalex Посмотреть сообщение
Дальше значения я кидаю в функцию преобразования фурье и уже выходной массив этой функции кидаю в ШИМ по таймеру..
Вместо спектра вижу какое то подобие цифрового сигнала..
А с какого перепуга на выходе этого ШИМа окажется спектрограмма?
Чтобы ШИМ стал ЦАПом и синтезировал некую функцию, нужно частоту ШИМа выбрать хотя бы на порядок выше верхней частоты синтезируемого сигнала и поставить какой никакой ФНЧ на выходе этого ШИМа.
Фактически стоит задача показать столбики пропорциональные по высоте значениям в выходном массиве БПФ.
Выводить массив можно медленно, скажем с периодом накопления или еще реже. Это асинхронный с БПФ процесс.
Спектрограмма не имеет смысла во времени. Время накопления превратится в полосу одного фильтра.
Марк на форуме   Ответить с цитированием
Старый 03.10.2019, 00:43   #17
maagalex
Senior Member
 
Аватар для maagalex
 
Регистрация: 25.02.2007
Адрес: &Alex==Israel.BatYam
Возраст: 43
Сообщений: 4,455
Вес репутации: 2476/115
maagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond repute
Отправить сообщение для maagalex с помощью ICQ Отправить сообщение для maagalex с помощью MSN Отправить сообщение для maagalex с помощью Skype™
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от Марк Посмотреть сообщение
А с какого перепуга на выходе этого ШИМа окажется спектрограмма?
Чтобы ШИМ стал ЦАПом и синтезировал некую функцию, нужно частоту ШИМа выбрать хотя бы на порядок выше верхней частоты синтезируемого сигнала и поставить какой никакой ФНЧ на выходе этого ШИМа.
Фактически стоит задача показать столбики пропорциональные по высоте значениям в выходном массиве БПФ.
Выводить массив можно медленно, скажем с периодом накопления или еще реже. Это асинхронный с БПФ процесс.
Спектрограмма не имеет смысла во времени. Время накопления превратится в полосу одного фильтра.
Все правильно, ШИМ работает на высокой частоте и есть RC цепочка, а форма выводится на низкой частоте, обновляясь на экране примерно пару раз в секунду..это видно на видео
Возможно мне вообще нужно смотреть в сторону вейвлет-преобразования, но не нашел примеров его реализации в программе..
maagalex вне форума   Ответить с цитированием
Старый 03.10.2019, 07:41   #18
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,532
Вес репутации: 4887/116
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от maagalex Посмотреть сообщение
Все правильно, ШИМ работает на высокой частоте и есть RC цепочка, а форма выводится на низкой частоте, обновляясь на экране примерно пару раз в секунду..это видно на видео
Возможно мне вообще нужно смотреть в сторону вейвлет-преобразования, но не нашел примеров его реализации в программе..
цель то есть вообще? Если вспомнить про ваши домофоны, то искать надо готовые кодеки c низкими битрейтами. G.729, G.711. и т.п.
под некоторые есть готовые микросхемы
ampersant вне форума   Ответить с цитированием
Старый 03.10.2019, 08:12   #19
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 2,625
Вес репутации: 3663/107
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от maagalex Посмотреть сообщение
Все правильно, ШИМ работает на высокой частоте и есть RC цепочка, а форма выводится на низкой частоте, обновляясь на экране примерно пару раз в секунду..это видно на видео
Возможно мне вообще нужно смотреть в сторону вейвлет-преобразования, но не нашел примеров его реализации в программе..
Пардон, только сейчас посмотрел видео.
Там и не пахнет никаким ЦАПом на ШИМе. Тупо обычный ШИМ в своем первородном виде.
Это раз.
А два состоит в том, что Вам действительно стоит начать с ДПФ, что бы понять ЧТО ВООБЩЕ БУДЕТ ИЗ СЕБЯ ПРЕДСТАВЛЯТЬ СПЕКТР представленного "синуса".
Патамушта это никакой не синус, а его обрезок длительностью менее периода.
А если смотреть во времени, то еще и с произвольной фазой.
И таки действительно, а зачем все это Вам? Цель какая ставится?
Марк на форуме   Ответить с цитированием
Старый 03.10.2019, 10:55   #20
maagalex
Senior Member
 
Аватар для maagalex
 
Регистрация: 25.02.2007
Адрес: &Alex==Israel.BatYam
Возраст: 43
Сообщений: 4,455
Вес репутации: 2476/115
maagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond repute
Отправить сообщение для maagalex с помощью ICQ Отправить сообщение для maagalex с помощью MSN Отправить сообщение для maagalex с помощью Skype™
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от ampersant Посмотреть сообщение
цель то есть вообще? Если вспомнить про ваши домофоны, то искать надо готовые кодеки c низкими битрейтами. G.729, G.711. и т.п.
под некоторые есть готовые микросхемы
Цель распознавать речь и идентифицировать человека по гармоникам его голоса..а кодаки при чем?
Цитата:
Сообщение от Марк Посмотреть сообщение
Пардон, только сейчас посмотрел видео.
Там и не пахнет никаким ЦАПом на ШИМе. Тупо обычный ШИМ в своем первородном виде.
Это раз.
А два состоит в том, что Вам действительно стоит начать с ДПФ, что бы понять ЧТО ВООБЩЕ БУДЕТ ИЗ СЕБЯ ПРЕДСТАВЛЯТЬ СПЕКТР представленного "синуса".
Патамушта это никакой не синус, а его обрезок длительностью менее периода.
А если смотреть во времени, то еще и с произвольной фазой.
И таки действительно, а зачем все это Вам? Цель какая ставится?
В первой части видео видно синус ровный, без ступенек, как же это обычный ШИМ?..У ШИМ там частота такая что он выглядел бы как сплошная светящаяся область..
По периодам там со временем меняется фаза и частота, и между метками в итоге оказывается десяток периодов..это я объяснял в видео..
По фазе вообще не понимаю как можно говорить о начале периода если в смешанном сигнале вообще не очевидно где то начало, направление графика меняется то снизу, то сверху..

Последний раз редактировалось maagalex; 03.10.2019 в 11:04.
maagalex вне форума   Ответить с цитированием
Старый 03.10.2019, 11:02   #21
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 2,625
Вес репутации: 3663/107
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Ну тогда БПФ точно как собаке пятая нога...
Вейвлеты позволят получить трехмерную картину, но отличать людей друг от друга - это следующий уровень абстракций, который на порядки сложнее самого анализа. Тем более по произвольно сказанной фразе.
Марк на форуме   Ответить с цитированием
Старый 03.10.2019, 11:22   #22
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 2,625
Вес репутации: 3663/107
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от maagalex Посмотреть сообщение

В первой части видео видно синус ровный, без ступенек, как же это обычный ШИМ?..У ШИМ там частота такая что он выглядел бы как сплошная светящаяся область..
.
Я говорил не про синус, а про массив БПФ. К тому же на выходе БПФ имеют место быть ДВА массива из которых можно получить амплитудный и фазовый спектр.
Марк на форуме   Ответить с цитированием
Старый 03.10.2019, 11:46   #23
maagalex
Senior Member
 
Аватар для maagalex
 
Регистрация: 25.02.2007
Адрес: &Alex==Israel.BatYam
Возраст: 43
Сообщений: 4,455
Вес репутации: 2476/115
maagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond repute
Отправить сообщение для maagalex с помощью ICQ Отправить сообщение для maagalex с помощью MSN Отправить сообщение для maagalex с помощью Skype™
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от Марк Посмотреть сообщение
Ну тогда БПФ точно как собаке пятая нога...
Вейвлеты позволят получить трехмерную картину, но отличать людей друг от друга - это следующий уровень абстракций, который на порядки сложнее самого анализа. Тем более по произвольно сказанной фразе.
Ну почему же?..У человека не динамик вибрирует а голосовой тракт, где каждый участок формирует некую свою индивидуальную частоту, и таких участков несколько..Я даже произносил одно и то же слово много раз и скринил , накладывал графики-частота точно повторяется во всех случаях..
Если можно сложный сигнал разложить на простые то вероятно и базовые частоты можно сравнить с эталонными, да мне и не сейф нужно защищать а всего то дверь в подъезд)..
ДПФ и позволяет разложить сигнал на составляющие..
В библиотеке что я использовал (стандартная на С) есть только входной массив на 128 байт и выходной такой же..
Попробовал вчера перевернуть нижний полубайт 0->127; 1->126 и тд..не помогло-то же самое..
maagalex вне форума   Ответить с цитированием
Старый 03.10.2019, 11:56   #24
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 2,625
Вес репутации: 3663/107
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Вы не понимаете, что голос не генерирует синус. Ни как гармоники, ни как основной тон. Разрешающая способность любой математики Фурье определяется временем накопления. И на выходе этой математики мы имеем амплитуду и фазу СИНУСОИД. А синусоида априори бесконечна во времени и не имеет ни начала ни конца. То есть Фурье не пригоден для разложения коротких сигналов. Для этого существует вейвлет-анализ. Он сворачивает массив с вейвлетами разных частот и имеет на выходе ТРИ координаты - амплитуда, частота и время. Фурье на выходе временем не оперирует. Только фазами бесконечных во времени гармоник.
Марк на форуме   Ответить с цитированием
Старый 03.10.2019, 12:01   #25
maagalex
Senior Member
 
Аватар для maagalex
 
Регистрация: 25.02.2007
Адрес: &Alex==Israel.BatYam
Возраст: 43
Сообщений: 4,455
Вес репутации: 2476/115
maagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond repute
Отправить сообщение для maagalex с помощью ICQ Отправить сообщение для maagalex с помощью MSN Отправить сообщение для maagalex с помощью Skype™
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от Марк Посмотреть сообщение
Вы не понимаете, что голос не генерирует синус. Ни как гармоники, ни как основной тон. Разрешающая способность любой математики Фурье определяется временем накопления. И на выходе этой математики мы имеем амплитуду и фазу СИНУСОИД. А синусоида априори бесконечна во времени и не имеет ни начала ни конца. То есть Фурье не пригоден для разложения коротких сигналов. Для этого существует вейвлет-анализ. Он сворачивает массив с вейвлетами разных частот и имеет на выходе ТРИ координаты - амплитуда, частота и время. Фурье на выходе временем не оперирует. Только фазами бесконечных во времени гармоник.
Любой сигнал это смесь синусов, но я был уверен что для ДПФ достаточно одного периода для разложения на составляющие..Но стоп..как же накопление если в библиотеке используется массив на 128 значений? Если эти значения опишут только один полный период библиотека не будет работать?
maagalex вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 3 (пользователей: 1 , гостей: 2)
Марк
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем/как отлаживать код написаный на Си в WinAVR Yokel Микроконтроллеры других производителей 49 30.09.2014 09:48
Присоветуйте тип и способ управления MOSFETом "верхнего" плеча dr_Sash Источники питания и силовая электроника 37 08.09.2012 18:50
подключение магнитолы Sergey1 Общетехнические вопросы 10 27.12.2007 22:39
Помогите, пожалуйста, найти ошибку в коде Катя Микроконтроллеры других производителей 26 08.12.2007 14:58
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00


Часовой пояс GMT +3, время: 09:55.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot