Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.255.31] |
|
Страницы: (5) [1] 2 3 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Еще раз о FFT
Может ли спектр быть больше самого сигнала? т.е. есть функция fft(double *In, int Size); она делает преобразование фурье от буфера In и выдает его в тот же буфер. Например входной сигнал имеет амплитуду 32767. Может ли после преобразования фурье буфер In содержать значения больше 32767 (или меньше -32678) |
Сообщ.
#2
,
|
|
|
Знаешь, сам когда-то возился с этим. Вообще не может, только в редких случаях, когда колебания накладываются и получается резонанс, но это редкий случай. Это теория, но на практике у меня выходило наоборот. Вот сорец, он 100\% работоспособный, переработанный алгоритм из книги Рабинера и Гоулда.
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 ) ; } |
Сообщ.
#3
,
|
|
|
Исходник мне не нужен, мне нужно знать может ли фурье образ быть больше самого сигнала и в каких случаях это может быть?
|
Сообщ.
#4
,
|
|
|
и на сколько (или во сколько) фурье образ может быть больше сигнала
|
Сообщ.
#5
,
|
|
|
безусловно может... математическое доказательство - это например дельта-функция... что, в свою очередь, дает ответ на второй вопрос - не просто может а может быть больше в любое число раз (и в бесконечное тоже)...
|
Сообщ.
#6
,
|
|
|
А разве фурье от дельта функции не 1?
если берем дискретную послелдовательность то дельта функция будет выглядеть так. 0, 0, 0, 0, 0, .... 1, 0, 0, 0, 0, дискретное фурье от нее разве будет больше 1? Мне о реальных сигналах? Может ли так получится что из 16 битного сигнала получится после фурье 32 битный спектр ( к примеру)? |
Сообщ.
#7
,
|
|
|
я наверное не совсем ясно выразился (продолжая тему матемитики). фурье от дельты - единица. но есть преобразование лапласа (взаимнооднозначное), которое в частности, используется в задачах на исследование поведения распределеия Гиббса в предельных случаях.
с помошью него показывается, это самое распределение и дельта являются образами/прообразами друг друга. Но распределение Гиббса конечно. Это и есть ответ на твой вопрос. :-[ пример реального сигнала - цуг синуса и его спектр. |
Сообщ.
#8
,
|
|
|
Вот это мне понравилось:
Цитата Напоминает "В военное время значение синуса может достигать двух!" ))Вообще не может, только в редких случаях |
Сообщ.
#9
,
|
|
|
Цитата vot, 04.04.02, 16:30:07 Вот это мне понравилось: Напоминает "В военное время значение синуса может достигать двух!" )) Ой-ой, больно ты умен :-) , ну подумаешь, потрещал я , вот. На самом деле, ФФТ - загадка природы и доконца еще не изучена человечеством, так что вы, ребята, зря паритесь, я сорец залил, вот и юзайте. А вообще я знаю человека, СУПЕРПРОФЕССИОНАЛА по преобразованию Фурье и вообще по обработке сигналов в цифре, могу порекомендовать в индивидуальном порядке, правда...он не с этой планеты, но думаю это вас не остановит. поки |
Сообщ.
#10
,
|
|
|
2Melan
Порекомендуй человека плиз! |
Сообщ.
#11
,
|
|
|
Цитата Melan, 08.04.02, 19:41:28 могу порекомендовать в индивидуальном порядке, правда...он не с этой планеты, но думаю это вас не остановит. поки И мне плиз. |
Сообщ.
#12
,
|
|
|
Если у кого есть вопросы то могу немного помочь про фурье, я вроде как достаточно уже с ним разобрался
|
Сообщ.
#13
,
|
|
|
Цитата Z@, 03.05.02, 23:48:21 Если у кого есть вопросы то могу немного помочь про фурье, я вроде как достаточно уже с ним разобрался Здравствуй! Мне нужны исходники преобразования Фурье на jave, где я мог бы их достать? |
Сообщ.
#14
,
|
|
|
Ну во первых В военное время значение синуса может достигать двух! так это правда просты чайник в области функций комплексных переменных.
Цитата Z@ 13.03.02 19:07:22 Еще раз о FFT Может ли спектр быть больше самого сигнала? т.е. есть функция fft(double *In, int Size); она делает преобразование фурье от буфера In и выдает его в тот же буфер. Например входной сигнал имеет амплитуду 32767. Может ли после преобразования фурье буфер In содержать значения больше 32767 (или меньше -3267 Ответ может на пример чистая синусоида, при обратном приобразованиии делят на Size |
Сообщ.
#15
,
|
|
|
Блин, хочу сделать преобразование Фурье.... Нифига не получается, вернее получается, но какая-то фигня. Числа охрененно большие, рисует полную парашу. Конечно спектр это напоминает, но совсем отдаленно. Я вот вообще не рублю: это преобразование ничего "не знает ни о частоте дискретизиции сигнала, ни о ширине спектра, так что же означают выходные данные, амплитуду какой частоты они показывают, и вообще, какая это нахрен амплитуда 10^10.
Я вот думаю.... преобразование Фурье - это ведь по сути скалярное произведение векторов (т.е. сигнала на комплексные экспоненты) которое позволяет выявить меру присутствия комплексной экспоненты той или иной частоты в сигнале. Если я не прав, то поправьте меня скорее, пока не наделал глупостей и не погубил весь мир. Так вот, модет, чтобы не париться с выходными величинами нужно просто нужно привести весь сиггнал к амплитуде от -1 до 1, потом сделать ффт и получить приоичный результат. Кстати, кто-нибудь в кусре - неужели программы типа Winamp делают "честное" FFT для визуализации спектра или же там делаются какие-то упрощения и допущения, чтобы ускорить процесс и сделать картинку более красивой? |