реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> БПФ, может есть у кого исходник?
Pianist
сообщение Mar 14 2009, 20:10
Сообщение #1





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



Всем добрый вечер. Хочу реализовать простенький анализатор спектра на AVR. Микроконтроллер пока не выбрал. Может есть у кого программа быстрого преобразования фурье на С? Поделитесь пожалуйста...

Сообщение отредактировал Pianist - Mar 14 2009, 20:11
Go to the top of the page
 
+Quote Post
Alex11
сообщение Mar 15 2009, 10:32
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Посмотрите. Это, конечно, под PC, но там полторы страницы текста, можно оптимизировать и под контроллер.Прикрепленный файл  FFT32k.zip ( 1010 байт ) Кол-во скачиваний: 938
Go to the top of the page
 
+Quote Post
klen
сообщение Mar 15 2009, 10:55
Сообщение #3


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



тут все уже сделано, используются инструкции арифметики дробная фиксированой запятой

http://elm-chan.org/works/akilcd/report_e.html
Go to the top of the page
 
+Quote Post
Pianist
сообщение Mar 15 2009, 19:26
Сообщение #4





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



Спасибо. Но все же хочется самому попробовать. Насколько я понял без операции умножения мне далеко не уехать, а из микроконтроллеров AVR аппаратное умножение появилось только у АтМега128?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 15 2009, 20:32
Сообщение #5


Йа моск ;)
******

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



Цитата
умножение появилось только у АтМега128?


Все современные AVR серии Mega имеют аппаратный умножитель. Вы давно не посещали сайт Атмела smile.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
blackfin
сообщение Mar 16 2009, 03:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Pianist @ Mar 14 2009, 23:10) *
Может есть у кого программа быстрого преобразования фурье на С? Поделитесь пожалуйста...

БПФ
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 16 2009, 05:15
Сообщение #7


Профессионал
*****

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



Цитата(klen @ Mar 15 2009, 13:55) *
тут все уже сделано, используются инструкции арифметики дробная фиксированой запятой
http://elm-chan.org/works/akilcd/report_e.html
+5
на чистом Си для AVR можно и не начинать - скорости не хватит для реального времени

bb-offtopic.gif не могу удержаться... вот что с помощью этой либы сделал


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 16 2009, 06:48
Сообщение #8


Йа моск ;)
******

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



Цитата
на чистом Си для AVR можно и не начинать - скорости не хватит для реального времени


Да ладно. Для такого спектроанализатора достаточно было сделать 10 гетеродинных фильтров. Без всякого Фурье. По скорости это, ну, на вскидку, не более 15-20% CPU Load.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
GDI
сообщение Mar 16 2009, 07:42
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Вот, на асме, правда, 64 точки 8 бит DFT. Не моё, сам где то когда то скачал.
Прикрепленные файлы
Прикрепленный файл  DFT864V1.zip ( 3.6 килобайт ) Кол-во скачиваний: 133
Прикрепленный файл  GLOBDEFS.zip ( 6.32 килобайт ) Кол-во скачиваний: 118
Прикрепленный файл  MathCons.zip ( 2.45 килобайт ) Кол-во скачиваний: 121
 


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 16 2009, 08:08
Сообщение #10


Профессионал
*****

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



Цитата(Rst7 @ Mar 16 2009, 09:48) *
Да ладно. Для такого спектроанализатора достаточно было сделать 10 гетеродинных фильтров. Без всякого Фурье. По скорости это, ну, на вскидку, не более 15-20% CPU Load.
речь идет об анализаторе или о реализации БПФ на Си? мое мнение о нехватке производительности относилось к реализации на Си БПФ для AVR.

на счет вашего варианта не могу сказать ничего, хотя сомнения все-таки есть... особенно если эти фильтры так же на чистом Си делать...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 16 2009, 08:18
Сообщение #11


Йа моск ;)
******

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



Цитата
мое мнение о нехватке производительности относилось к реализации на Си БПФ для AVR.


Ну вот в теме про распознование голоса мы делали DHT, правда, 32хточечный. На чистом Си. Не померли smile.gif 2000 тактов.

Цитата
на счет вашего варианта не могу сказать ничего, хотя сомнения все-таки есть... особенно если эти фильтры так же на чистом Си делать...


Да нефиг там делать. Все просто, как стол.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 16 2009, 09:06
Сообщение #12


Профессионал
*****

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



Цитата(Rst7 @ Mar 16 2009, 11:18) *
Ну вот в теме про распознование голоса мы делали DHT, правда, 32хточечный. На чистом Си. Не померли smile.gif 2000 тактов.
гм... нашел ваши исходники... все-таки ваш код можно назвать "чистым Си" с весьма большой натяжкой - там все сделано не только в виде оптимизации алгоритма, но и специально заточено на IAR... в сущности, доказывать, что при глубоком знании особенностей компилятора и умелом их использовании можно получить очень близкий к чисто ассемблерному варианту код - бессмысленно. я же имел ввиду под чистым Си, когда возведение в степень так и делается long result = var * var; smile.gif
т.е. ваше решение "не в лоб", а я говорил о "лобовой атаке" smile.gif все расставлено по своим местам.

а вот по поводу полосовых фильтров - увы, в ЦОС не шибко силен... считаете, что 10 цифровых полосовых фильтров будут быстрее БПФ?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 16 2009, 09:13
Сообщение #13


Йа моск ;)
******

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



Цитата
но и специально заточено на IAR...


IAR пока является наиболее оптимальным компилятором для AVR (несмотря на некоторые свои забобоны). Так что имею право. А если бы тут был ARM, то функции, помеченные как hard-coded функции заменяеются на прямой код без извращений и все нормально работает.

Т.е. например
Код
//Hardcoded for AVR, return (var*c)>>8;
#pragma inline=forced
static int FDMUL(int var, UREG c)
{
  int v=__multiply_signed_with_unsigned(var>>8,c);
  unsigned int v2=__multiply_unsigned(var,c);
  v+=v2>>8;
  return v;
}


заменяется на

Код
#pragma inline=forced
static int FDMUL(int var, UREG c) {return (var*c)>>8;}


И всем славно.

Цитата
считаете, что 10 цифровых полосовых фильтров будут быстрее БПФ?


Конечно. Потому что отсчетов для БПФ надо брать намного больше - необходимые полосы на каждой интересующей частоте разной ширины - это легко решается в случае фильтров.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 16 2009, 09:23
Сообщение #14


Профессионал
*****

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



Цитата(Rst7 @ Mar 16 2009, 12:13) *
Потому что отсчетов для БПФ надо брать намного больше - необходимые полосы на каждой интересующей частоте разной ширины - это легко решается в случае фильтров.
больше 32? я обошелся 32 отсчетами... но с полосовыми хотелось бы разобраться... что-нибудь посоветуете? если можно, "для средних умов" 05.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 16 2009, 09:31
Сообщение #15


Йа моск ;)
******

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



Цитата
больше 32?


Ну и как тогда получить с частотами
Цитата
32, 64, 125, 250, 500 Гц и 1, 2, 4, 8, 15,5

правильные полосы? 32 точки с нижней частотой в 32Гц имеют верхнуюю полосу в 1024Гц. А никак не 15.5.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 16 2009, 10:03
Сообщение #16


Профессионал
*****

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



Цитата(Rst7 @ Mar 16 2009, 12:31) *
правильные полосы? 32 точки с нижней частотой в 32Гц имеют верхнуюю полосу в 1024Гц. А никак не 15.5.
частоты правильные. я же не говорил, что я из одного комплекта в 32 отсчета все частоты получаю smile.gif
а что на счет моей просьбы? unsure.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 16 2009, 10:21
Сообщение #17


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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).


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 16 2009, 11:32
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 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).
спасибо, покумекаю на досуге...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 16 2009, 12:10
Сообщение #19


Йа моск ;)
******

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



Цитата
2


И дальше что? Полосы суммируете? Т.е. из 32х мощностей берете 1,2+3,4+5+6+7,... и т.д.?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 16 2009, 13:11
Сообщение #20


Профессионал
*****

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



Цитата(Rst7 @ Mar 16 2009, 15:10) *
И дальше что? Полосы суммируете? Т.е. из 32х мощностей берете 1,2+3,4+5+6+7,... и т.д.?
нет, не суммирую, просто беру нужные гармоники.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 16 2009, 13:20
Сообщение #21


Йа моск ;)
******

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



Цитата
нет, не суммирую, просто беру нужные гармоники.


Ну и что это получается? Что на частоте, скажем 8кГц вы обрабатываете только полосу в 1кГц. Т.е. между полосами у Вас дырки, причем эти дырки шире самих полос. Фигня-с wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
GDI
сообщение Mar 16 2009, 13:22
Сообщение #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 это длина ДПФ


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 16 2009, 13:27
Сообщение #23


Йа моск ;)
******

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



Цитата
Уважаемый rst7 это не классический ли ДПФ получается


Конечно. Это одна гармоника ДПФ.

Цитата
только там где то нужно умножить на 1/N.


Ну это один раз после всех операций. Сложность аж О(1), так что можно не учитывать. Но помнить.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 16 2009, 17:23
Сообщение #24


Профессионал
*****

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



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

P.S. выходит, ваш "полосовой фильтр" ничем от БПФ не отличается... а я уж подумал было...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 16 2009, 17:39
Сообщение #25


Йа моск ;)
******

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



Цитата
наконец, целочисленная арифметика дает, мягко говоря, небольшую погрешность, еще более размазывающую полосу...


Для 32х точек эта погрешность исчезающе мала.

А правильный октавный спектроанализатор должен показывать мощность сигнала в каждой полосе от 0.707*F до 1.41*F, где F - центральная частота. Так что "показометр" именно у Вас.

От противного - октавный эквалайзер имеет именно такие полосы регулировки. А не полосу в 1кГц на центральной частоте 8кГц.

Цитата
выходит, ваш "полосовой фильтр" ничем от БПФ не отличается... а я уж подумал было...


Отличается. Еще и как. Курите глубже smile.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 16 2009, 20:14
Сообщение #26


Профессионал
*****

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



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 17 2009, 08:36
Сообщение #27


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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).


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 17 2009, 10:03
Сообщение #28


Профессионал
*****

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



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 17 2009, 10:29
Сообщение #29


Йа моск ;)
******

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



Цитата
так вот, будет очень неубедительно, если флейта станет "индицироваться" столбиками от 1 до 8 кимлогерц - хоть какого уровня... пропадет динамика картины, а именно это главное в подобных девайсах не так ли? мы ведь не о каком-то научном спектральном анализе ведем речь...


Не далее, как несколько постов назад Вы обвиняли меня в том, что, якобы, у меня "показометр" -
Цитата
Кстати, как вы себе представляете спектроанализатор без дырок между полосами?! Это уже будет показометр - как в китайских магнитолах, просто фиксированные "картинки"


Я требую сатисфакции biggrin.gif

Кстати, о "качестве" картинки. Если Вам потреблястов развлекать мигающими светодиодиками - не возражаю. А вот если Вы свой девайс воткнете в какой-нибудь микшерский пульт - потом может быть стыдно за свою поделку. Объясняю почему - допустим, мы увеличили усиление в какой-то полосе (ну так нам захотелось), при этом пытаемся сориентироваться по Вашему "октавному спектроанализатору", не перегрузим ли мы дальнейший тракт. Однако, оказалось, что максимальная спектральная плотность сигнала совсем не на той частоте, которую показывается Ваш "показометр", а всего-лишь рядом. В результате: Ваш "показометр" показывает, что все окей, перегруза нет, на местном контроле в ушах вроде все хорошо (потому что запасы обычно немалые), а дальше вполне хватило для перегрузки, например, АЦП/усилителя в тракте записи.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
rubic
сообщение Jan 8 2010, 19:54
Сообщение #30


Участник
*

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



кто может занимался с этой библиотекой FFT,у меня много непоняток
вопрос :
Функция fft_input(capture, bfly_buff) должна должна сортировать входные данные(capture) для так называемой "бабочки" в (bfly_buff) с нечётными номерами в дну половину буфера с чётными в другую,у меня же полная били...да получается и вообще bfly_buff с адресом выше 64 она заполняет нулями ,может здесь алгоритм какой другой или я что непонимаю
Прикрепленные файлы
Прикрепленный файл  avrfft.zip ( 22.6 килобайт ) Кол-во скачиваний: 69
 
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 9 2010, 06:16
Сообщение #31


Профессионал
*****

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



на сколько я помню, перестановки там делаются уже после FFT, в самом конце расчетов. инпут просто буфер заполняет


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
rubic
сообщение Jan 9 2010, 06:59
Сообщение #32


Участник
*

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



После преобразвания тоже но это другое зависит от алгоритма,но все исходники которые мне встречались сначала выстраивают матрицу например для FFT_N=16 {a0,a1,a2....a15} в {a0,a8,a4,a12,a2,a10,a6,a14,a1,a9,a5,a13,a3,a11,a7,a15} для удобства вычисления
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 9 2010, 13:56
Сообщение #33


Профессионал
*****

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



чен сделал комплексное БПФ, поэтому мнимые части просто обнуляются. по-моему, так. а перестановки у него в библиотеке после всего сделаны были


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
rubic
сообщение Jan 9 2010, 14:58
Сообщение #34


Участник
*

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



Цитата
по-моему

это по твоему,а в реале спектр только 32 значения склько выброк неделай
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 9 2010, 20:35
Сообщение #35


Профессионал
*****

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



ну не знаю smile.gif я ченовскую библиотеку вдоль и поперек перешерстил, и 16 выборок делал и 128... и получал соответственно 8 или 64 полосы в спектре... и по-своему все переделывал... smile.gif результат одного из вариантов можно видеть тут вживую практицки


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
rubic
сообщение Jan 10 2010, 10:21
Сообщение #36


Участник
*

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



хорошо давай вместо ADC смоделируем синусоиду:

Цитата
FFT_N=256//fft.h
uint8_t y=0;
for(double i=0;i<2*M_PI;i+=2*M_PI/FFT_N)
{
capture[y]=511+511*sin(F*i);//F от 1 до 128
y++;
}

fft_input(capture, bfly_buff);
fft_execute(bfly_buff);
fft_output(bfly_buff, spektrum);



протестируй на симуляторе с разными F,будут заполнятся в [spektrum] адреса больше 32?
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 10 2010, 10:43
Сообщение #37


Профессионал
*****

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



я не буду заниматься ерундой. 256 точек в память atmega8/16 не влезет - я такой цели не ставил. а для 128 и ниже - уже проверял. но я переписал все функции по-своему - оставил только само FFT, а ввод и перестановку свои сделал. все отлично делается.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Dx!
сообщение Jan 11 2010, 04:18
Сообщение #38


Частый гость
**

Группа: Участник
Сообщений: 108
Регистрация: 6-02-09
Из: Новочеркасск
Пользователь №: 44 469



Цитата(rubic @ Jan 10 2010, 14:21) *
протестируй на симуляторе с разными F,будут заполнятся в [spektrum] адреса больше 32?

Я тоже игрался с библиотекой чена - работает адекватно. Давал генератором синусоиду, получал один-единственный столб спектра. Работала до 1024 выборок, давала честные 512 отсчётов спектра, в реальном времини.
Единственно - там передискретизация может быть. Доходим до 8кгц (ацп меги с тактом 250кгц) и при дальнейшем повышении частоты источника спектр показывает её уменьшение... Нужно аналогово фильтровать...
Go to the top of the page
 
+Quote Post
GG Markes
сообщение May 20 2010, 19:01
Сообщение #39





Группа: Участник
Сообщений: 3
Регистрация: 20-05-10
Пользователь №: 57 406



Могу я поинтересоваться, чем уважаемые форумчане компилируют прогаммы чена?
Go to the top of the page
 
+Quote Post
ARV
сообщение May 22 2010, 13:07
Сообщение #40


Профессионал
*****

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



Цитата(GG Markes @ May 20 2010, 23:01) *
Могу я поинтересоваться, чем уважаемые форумчане компилируют прогаммы чена?
avr-gcc, он же WinAVR


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
GG Markes
сообщение Jun 7 2010, 19:22
Сообщение #41





Группа: Участник
Сообщений: 3
Регистрация: 20-05-10
Пользователь №: 57 406



Цитата(ARV @ May 22 2010, 17:07) *
avr-gcc, он же WinAVR


Второй глупый вопрос. Не могли бы Вы пераметры командой строки показать? А то я запутался.
Go to the top of the page
 
+Quote Post
Dx!
сообщение Jun 9 2010, 21:47
Сообщение #42


Частый гость
**

Группа: Участник
Сообщений: 108
Регистрация: 6-02-09
Из: Новочеркасск
Пользователь №: 44 469



Вот левой пяткой писанная тестовая программка, в том числе и сабж тестирует.
http://www.xdevs.com/kb/dx/tmp/!PRG.lcd_fft_test.rar

Если вопрос только в FFT - этого много. Но, думаю, разобраться возможно. Тест выводит спектр на LCD от нокии. На частотах до ~8.5Кгц всё адекватно.
Go to the top of the page
 
+Quote Post
GG Markes
сообщение Jun 17 2010, 21:00
Сообщение #43





Группа: Участник
Сообщений: 3
Регистрация: 20-05-10
Пользователь №: 57 406



Цитата(Dx! @ Jun 10 2010, 01:47) *
Вот левой пяткой писанная тестовая программка, в том числе и сабж тестирует.
http://www.xdevs.com/kb/dx/tmp/!PRG.lcd_fft_test.rar

Если вопрос только в FFT - этого много. Но, думаю, разобраться возможно. Тест выводит спектр на LCD от нокии. На частотах до ~8.5Кгц всё адекватно.


Большое спасибо! Разобрался
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01793 секунд с 7
ELECTRONIX ©2004-2016