Великодушно прошу помоч. Две недели лазию по форумам — прошу хоть какой-нибудь совет. Акромя непонятно к чему ссылок, обращений к SDK, MSDN и Аллаху почти ничего.
Тема такая: Нужно захватить(?) потоковое аудио, обработать и вывести его как Spectrum analyzer в WinAmp или звуковых редакторах.
Один сердобольный человек прислал алгоритм быстрого преобразования Фурье. Больше ничего не прислал; сказал, что он все сам пишит и я должен сам писать. Я бы рад писать, но как? Никогда с ММ не работал, а тут такая задача стала.
Люди! Из гроба отчаянья взываю. Как мне получить то, что я через алгоритм FFT должен пропустить.
Здравствуйте XOR, Вы писали:
XOR>Великодушно прошу помоч. Две недели лазию по форумам — прошу хоть какой-нибудь совет. Акромя непонятно к чему ссылок, обращений к SDK, MSDN и Аллаху почти ничего.
Ну елы, палы ... А что ж тебе для полного счастья то еще нуно??? Дали ссылку на СДК — копай, там же все есть. ВОзникнут проблемы — пиши.
А готовый код тебе вряд-ли кто напишет, хотя может у кого-нить и есть время чтобы все это написать. XOR>Тема такая: Нужно захватить(?) потоковое аудио, обработать и вывести его как Spectrum analyzer в WinAmp или звуковых редакторах. XOR>Один сердобольный человек прислал алгоритм быстрого преобразования Фурье. Больше ничего не прислал; сказал, что он все сам пишит и я должен сам писать. Я бы рад писать, но как? Никогда с ММ не работал, а тут такая задача стала. XOR>Люди! Из гроба отчаянья взываю. Как мне получить то, что я через алгоритм FFT должен пропустить.
Тебе нужен Real Time?
Здравствуйте, XOR, Вы писали:
XOR>Великодушно прошу помоч. Две недели лазию по форумам — прошу хоть какой-нибудь совет. Акромя непонятно к чему ссылок, обращений к SDK, MSDN и Аллаху почти ничего. XOR>Тема такая: Нужно захватить(?) потоковое аудио, обработать и вывести его как Spectrum analyzer в WinAmp или звуковых редакторах. XOR>Один сердобольный человек прислал алгоритм быстрого преобразования Фурье. Больше ничего не прислал; сказал, что он все сам пишит и я должен сам писать. Я бы рад писать, но как? Никогда с ММ не работал, а тут такая задача стала. XOR>Люди! Из гроба отчаянья взываю. Как мне получить то, что я через алгоритм FFT должен пропустить.
Поставь DirectX SDK и смотри примеры к нему. Например:
The Scope filter is a renderer filter that displays sound data as wave forms.
Source: (SDK root)\Samples\C++\DirectShow\Filters\Scope
Вот здесь найдешь книгу Фроловых, по функциям для работы со звукам (функции низкоуровневые ведь поддержка даже на 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 функциями , используя значения полученные из массива после преобразования.
Кажется дальше объяснять не надо.
Здравствуйте, XOR, Вы писали:
XOR>Великодушно прошу помоч. Две недели лазию по форумам — прошу хоть какой-нибудь совет. Акромя непонятно к чему ссылок, обращений к SDK, MSDN и Аллаху почти ничего. XOR>Тема такая: Нужно захватить(?) потоковое аудио, обработать и вывести его как Spectrum analyzer в WinAmp или звуковых редакторах. XOR>Один сердобольный человек прислал алгоритм быстрого преобразования Фурье. Больше ничего не прислал; сказал, что он все сам пишит и я должен сам писать. Я бы рад писать, но как? Никогда с ММ не работал, а тут такая задача стала. XOR>Люди! Из гроба отчаянья взываю. Как мне получить то, что я через алгоритм FFT должен пропустить.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, XOR, Вы писали:
XOR>>Великодушно прошу помоч. Две недели лазию по форумам — прошу хоть какой-нибудь совет. Акромя непонятно к чему ссылок, обращений к SDK, MSDN и Аллаху почти ничего. XOR>>Тема такая: Нужно захватить(?) потоковое аудио, обработать и вывести его как Spectrum analyzer в WinAmp или звуковых редакторах. XOR>>Один сердобольный человек прислал алгоритм быстрого преобразования Фурье. Больше ничего не прислал; сказал, что он все сам пишит и я должен сам писать. Я бы рад писать, но как? Никогда с ММ не работал, а тут такая задача стала. XOR>>Люди! Из гроба отчаянья взываю. Как мне получить то, что я через алгоритм FFT должен пропустить.
А>Посмотри http://www.relisoft.com/freeware/freq.html
Неплохая книга "Цифровая обработка сигналов" (А.Б. Сергиенко)
Прочитай ее — там все есть. И Фурье, и быстрый Фурье, и еще полно всего.