Re: Анализатор спектра.
От: VertexDev Россия  
Дата: 10.12.03 14:04
Оценка:
Здравствуйте, XOR, Вы писали:

http://soobcha.ru/rushelp/articles/winmm/index.html

Вот здесь найдешь книгу Фроловых, по функциям для работы со звукам (функции низкоуровневые ведь поддержка даже на Windows 9x тебе может пригодится).
алгоритм такой:
загружаешь Wave файл (или записываешь звук с микрофона) с помощью функций которые прилагаются к этой книги.
У тебя будет массив значений , следовательно пропускаешь этот массив через преобразования Фурье:

int math_inverse_bits( int value, int bits ) 
 // инвертируем биты для преобразования Фурье 
{ 
 
    int result = 0 ; 
    int mask = 1 << (bits-1) ; 
 
    for ( int i=0; i<bits; i++ ) 
    { 
         
        if ( value & mask ) 
            result |= 1 << i ; 
 
        mask = mask >> 1 ; 
 
    } 
 
    return ( result ) ; 
 
} 
 
BOOL math_fft( double* dbl_array, int* nSize ) 
{ 
 
    // определяем длину для преобразования фурье 
    int tmp_size = *nSize ; 
    for( int M=0; tmp_size>1; tmp_size/=2,M++ ) ; 
 
    int fft_size = 1 << M ; // 1<<M == 2^M 
 
    // подготавливаем массив 
    std::complex<double>* fft_array =  
                            new std::complex<double>[ fft_size ] ; 
    ASSERT( fft_array ) ; 
 
    // устанавливаем порядок для fft 
    for ( int i=0; i<fft_size; i++ ) 
    { 
        fft_array[ math_inverse_bits(i,M) ] =  
            std::complex<double>(dbl_array[ i ],0.0) ; 
    } 
 
    double pi = 3.141592653589793 ; 
 
    // M этапов 
    for ( int l=0; l<M; l++ ) 
    { 
 
        int le = 1 << (l+1) ;  // le - смещение между бабочками 
        int le1 = le >> 1 ;    // le1 - размер бабочки 
        std::complex<double> U ( 1.0, 0.0 ) ; 
        std::complex<double> W ( cos( pi / le1  ), sin( pi / le1 ) ) ; 
 
        for ( int j=0; j<le1; j++ ) 
        { 
            for ( int i=j; i<fft_size; i+=le ) 
            { 
                int ip = i + le1 ; 
                std::complex<double> T = fft_array[ ip ] * U ; 
                fft_array [ ip ] = fft_array[ i ] - T ; 
                fft_array [ i ] = fft_array[ i ] + T ; 
            } 
 
            U *= W ; 
 
        } 
 
    } 
 
    for ( i=0; i<fft_size / 2 ; i++ ) 
    { 
        dbl_array[ i ] = std::abs( fft_array[ i ] ) ; 
    } 
 
    *nSize = fft_size / 2 ; 
 
    delete[] fft_array ;   fft_array = NULL ; 
 
    return ( TRUE ) ; 
 
}

Далее рисуешь график спектра GDI функциями , используя значения полученные из массива после преобразования.
Кажется дальше объяснять не надо.

Вот можешь в MSDN еще посмотреть :http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_waveform_functions.asp

P.S. Если лень рисовать самому график сигнала (звука) то можно использовать вот такой вот класс:
http://codeguru.com/multimedia/CWaveFile.html

Успехов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.