|
|
  |
БПФ, может есть у кого исходник? |
|
|
|
Mar 16 2009, 10:21
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата частоты правильные. я же не говорил, что я из одного комплекта в 32 отсчета все частоты получаю А это что: Цитата я обошелся 32 отсчетами... Так сколько у Вас там БПФ делается по 32 точки каждое? Цитата но с полосовыми хотелось бы разобраться... что-нибудь посоветуете? если можно, "для средних умов" А че там разбираться. Инициализируем sum_sin=0 и sum_cos=0. На каждом отсчете выполняем Код sum_sin+=signal*sin(phase*2*pi); sum_cos+=signal*cos(phase*2*pi); phase+=freq; После n отсчетов делаем power=sqrt(sum_sin^2+sum_cos^2); Итого, имеем полосовой фильтр плюс выпрямитель RMS с полосой Fдискретизации/n и средней частотой Fдискретизации*freq (вроде нигде не ошибся). При реализации нескольких октавных фильтров можно оптимайзить в районе нехранения phase и freq для каждой частоты (для каждого более высокочастотного фильтра phase[n+1]=phase[n]*2).
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Mar 16 2009, 11:32
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(Rst7 @ Mar 16 2009, 13:21)  Так сколько у Вас там БПФ делается по 32 точки каждое? 2 Цитата А че там разбираться. Инициализируем sum_sin=0 и sum_cos=0. На каждом отсчете выполняем Код sum_sin+=signal*sin(phase*2*pi); sum_cos+=signal*cos(phase*2*pi); phase+=freq; После n отсчетов делаем power=sqrt(sum_sin^2+sum_cos^2); Итого, имеем полосовой фильтр плюс выпрямитель RMS с полосой Fдискретизации/n и средней частотой Fдискретизации*freq (вроде нигде не ошибся). При реализации нескольких октавных фильтров можно оптимайзить в районе нехранения phase и freq для каждой частоты (для каждого более высокочастотного фильтра phase[n+1]=phase[n]*2). спасибо, покумекаю на досуге...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 16 2009, 13:22
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата А че там разбираться. Инициализируем sum_sin=0 и sum_cos=0. На каждом отсчете выполняем Код sum_sin+=signal*sin(phase*2*pi); sum_cos+=signal*cos(phase*2*pi); phase+=freq; После n отсчетов делаем power=sqrt(sum_sin^2+sum_cos^2); Уважаемый rst7 это не классический ли ДПФ получается, только там где то нужно умножить на 1/N. И с аргументом синусов и косинусов что то не то... Надо сделать как то так: Код sum_sin=0; sum_cos=0; for (i=0; i <N; i++){ sum_sin+=signal*sin(freq*2*pi/N); sum_cos+=signal*cos(freq*2*pi/N); } power=(1/N)*sqrt(sum_sin^2+sum_cos^2); Где N это длина ДПФ
--------------------
|
|
|
|
|
Mar 16 2009, 13:27
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Уважаемый rst7 это не классический ли ДПФ получается Конечно. Это одна гармоника ДПФ. Цитата только там где то нужно умножить на 1/N. Ну это один раз после всех операций. Сложность аж О(1), так что можно не учитывать. Но помнить.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Mar 16 2009, 17:23
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(Rst7 @ Mar 16 2009, 16:20)  Ну и что это получается? Что на частоте, скажем 8кГц вы обрабатываете только полосу в 1кГц. Т.е. между полосами у Вас дырки, причем эти дырки шире самих полос. Фигня-с  во-первых, для поставленной цели - самое нормальное. во-вторых, ширина индицируемой полосы (т.е. добротность фильтра обычными словами) вполне удовлетворительная, чтобы захватывать не 8К, а диапазон скажем от 7,5К до 8,2К. наконец, целочисленная арифметика дает, мягко говоря, небольшую погрешность, еще более размазывающую полосу... ну и, в-четвертых, наложение оконной функции никто не отменял (хотя мне и без нее хорошо)... Кстати, как вы себе представляете спектроанализатор без дырок между полосами?! Это уже будет показометр - как в китайских магнитолах, просто фиксированные "картинки"  P.S. выходит, ваш "полосовой фильтр" ничем от БПФ не отличается... а я уж подумал было...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 16 2009, 17:39
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата наконец, целочисленная арифметика дает, мягко говоря, небольшую погрешность, еще более размазывающую полосу... Для 32х точек эта погрешность исчезающе мала. А правильный октавный спектроанализатор должен показывать мощность сигнала в каждой полосе от 0.707*F до 1.41*F, где F - центральная частота. Так что "показометр" именно у Вас. От противного - октавный эквалайзер имеет именно такие полосы регулировки. А не полосу в 1кГц на центральной частоте 8кГц. Цитата выходит, ваш "полосовой фильтр" ничем от БПФ не отличается... а я уж подумал было... Отличается. Еще и как. Курите глубже
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Mar 16 2009, 20:14
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(Rst7 @ Mar 16 2009, 20:39)  Для 32х точек эта погрешность исчезающе мала. не знаю, не знаю... она заметна Цитата А правильный октавный спектроанализатор должен показывать мощность сигнала в каждой полосе от 0.707*F до 1.41*F, где F - центральная частота. нигде не встречал требований к "правльному" спектроанализатору  Цитата Так что "показометр" именно у Вас. вы первый, кому не понравилось Цитата От противного - октавный эквалайзер имеет именно такие полосы регулировки. А не полосу в 1кГц на центральной частоте 8кГц. не стану спорить - встречал в разных источникам массу вариантов, между которыми было много отличий... опять же, где эти нормы прописаны? на счет добротности фильтров эквалайзера? и насколько эти нормы таковыми являются? Цитата Отличается. Еще и как. Курите глубже  я подумаю (хотя это сложно).
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 17 2009, 08:36
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата не знаю, не знаю... она заметна Плохо накодили. Цитата нигде не встречал требований к "правльному" спектроанализатору Ваш имеет дырки между полосами. Т.е. зоны нечувствительности. Точнее, видимо, из-за ошибок в математике, какой-то мусор пролезает, но не более. В идеальном случае, если Вы подадите на вход синусоидальный (для простоты) сигнал с любой частотой, проссумировав мощности во всех полосах, Вы должны получить число, зависящее только от мощности входного сигнала, но не от частоты (в пределах рабочей полосы, у Вас от 32Гц до 16кГц). Цитата опять же, где эти нормы прописаны? на счет добротности фильтров эквалайзера? и насколько эти нормы таковыми являются? Нигде. Однако есть здравый смысл, опирающийся на опыт. Вы когда-нибудь слушали сигнал, в котором поднята одна очень узкая полоса? А такое будет при регулировке тембра очень узкими полосами. Цитата(GDI @ Mar 16 2009, 15:22)  И с аргументом синусов и косинусов что то не то... Надо сделать как то так: Да все то. Просто по привычке допустил пару тривиальных упрощений. Зачем делить на N каждый раз, если можно разделить 1 раз, и freq и phase. Да и цикл не интересует. Поэтому сделано накопление фазы. Умножение фазы на 2pi подразумевает, что аргумент phase имеет значение 0...1. Отнюдь не реальное умножение. В реальной жизни phase суть байт, 0...255, следовательно функция задается таблицей со значениями table_sin[index]=sin(index*pi/128).
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Mar 17 2009, 10:03
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Rst7, не в порядке спора, а чисто для пояснения. боюсь, анализатор спектра в том виде, как его задумал я, вряд ли станет удовлетворять эстетические потребности, если его сделать по вашему алгоритму, хотя умозрительно он верный... ведь по-вашему, если на входе присутствует сигнал хоть какой частоты, то анализатор должен что-то показать... так вот, будет очень неубедительно, если флейта станет "индицироваться" столбиками от 1 до 8 кимлогерц - хоть какого уровня... пропадет динамика картины, а именно это главное в подобных девайсах не так ли? мы ведь не о каком-то научном спектральном анализе ведем речь... что касается математических вычислений, то я их не делал сам, сэкономил силы/время, а воспользовался ранее указанной ссылкой, т.е. ЭлмЧеновской библиотекой - всего лишь подкорректировал ее под свои задачи. А его библиотека, хотя и ведет расчеты в 16-битных целых, страдает погрешностями, например, корень из 9 может оказаться равным 4... (я точно не помню. но когда тестировал - сильно удивлялся). на больших числах погрешность меньше, но все равно где-то до 10-15% запросто достигает... если младшие биты отбрасывать, получается незаметно внешне - я и смирился. кстати, быстродействие ченовской библиотеки ничуть не ниже вашего варианта, и, наверное, даже выше - для 128-точечного БПФ я получал без малого 100fps для своего индикатора 8х8 - причем с учетом семплов АЦП (около 32 ksps)... если память не изменяет, весь цикл был то ли 11, то ли 16 (могу ошибаться) миллисекунд... так что в угоду скорости принесена точность...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 17 2009, 10:29
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата так вот, будет очень неубедительно, если флейта станет "индицироваться" столбиками от 1 до 8 кимлогерц - хоть какого уровня... пропадет динамика картины, а именно это главное в подобных девайсах не так ли? мы ведь не о каком-то научном спектральном анализе ведем речь... Не далее, как несколько постов назад Вы обвиняли меня в том, что, якобы, у меня "показометр" - Цитата Кстати, как вы себе представляете спектроанализатор без дырок между полосами?! Это уже будет показометр - как в китайских магнитолах, просто фиксированные "картинки" Я требую сатисфакции Кстати, о "качестве" картинки. Если Вам потреблястов развлекать мигающими светодиодиками - не возражаю. А вот если Вы свой девайс воткнете в какой-нибудь микшерский пульт - потом может быть стыдно за свою поделку. Объясняю почему - допустим, мы увеличили усиление в какой-то полосе (ну так нам захотелось), при этом пытаемся сориентироваться по Вашему "октавному спектроанализатору", не перегрузим ли мы дальнейший тракт. Однако, оказалось, что максимальная спектральная плотность сигнала совсем не на той частоте, которую показывается Ваш "показометр", а всего-лишь рядом. В результате: Ваш "показометр" показывает, что все окей, перегруза нет, на местном контроле в ушах вроде все хорошо (потому что запасы обычно немалые), а дальше вполне хватило для перегрузки, например, АЦП/усилителя в тракте записи.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 8 2010, 19:54
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 18-11-08
Пользователь №: 41 732

|
кто может занимался с этой библиотекой FFT,у меня много непоняток вопрос : Функция fft_input(capture, bfly_buff) должна должна сортировать входные данные(capture) для так называемой "бабочки" в (bfly_buff) с нечётными номерами в дну половину буфера с чётными в другую,у меня же полная били...да получается и вообще bfly_buff с адресом выше 64 она заполняет нулями ,может здесь алгоритм какой другой или я что непонимаю
Прикрепленные файлы
avrfft.zip ( 22.6 килобайт )
Кол-во скачиваний: 69
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|