AnisimovSlava 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Привет, all. Не знаю куда писать, но думаю - сюда. Задача - даже не знаю с какой стороны к ней подойти. Существует большое количество устройств, на базе ATmega32. Недавно, после совещания, шеф потребовал "добавить" спектральный агнализ принимаемого сигнала (не реал-тайм). Вроде бы для этого есть всё нужное оборудование. Если этого сделать нельзя, то надо обосновать почему. Я даже не представляю как подойти к этому вопросу. Буду балгодарен за любую помощь в этом вопросе. P.S. Фурье в ATmega32... Кажется абсурдом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem_Petrik 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Зачем же сразу "абсурдом"? Если время неограничено, то можно хоть на калькуляторе считать. Главный вопрос - влезут ли анализируемые данные в ОЗУ. Укажите фурье на сколько точек нужно, и сколько ОЗУ под расчеты выделить сможете. Ну и разрядность входных/выходных данных тоже. Тогда можно будет что-то сказать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ssvSerge 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Фурье в ATmega32... Кажется абсурдом. Интересная задачка. Давайте скажем честно: Считать на калькуляторе можно. Но вот результаты этого вряд ли кому-либо будут нужны. Поэтому без модификации преобразования вам не обойтись. Посмотрите в эту сторону. Наверняка найдете что-либо подходящее. Сам же вам подскажу вот какой вариант: Что произойдет если вы перемножите сигнал, на шаблон (синусоиду в вашем случае)? Ответ простой - если в сигнале есть этот шаблон, то вы получите "единицу". Ну, а если ее нет, то получите нолик. Теперь вам остается выяснить только сдвиг фаз и амплитуду. Ну, если с амплитудой все понятно, то сдвиг фаз придется попросту подбирать. Теперь задача сводится к тому, что вам надо сохранить нужное количество шаблонов синусоид и тупо перемножать полученные отсчеты на шаблон. После подбора сдвига фаз у вас в руках будет полная информация типа: Шаблон №01 (50 Гц): Сдвиг 5 градусов, Амплитуда 0x50 Шаблон №02 (60 Гц): Сдвиг 15 градусов, Амплитуда 0x80 ... Шаблон №?? (?? Гц): Сдвиг 40 градусов, Амплитуда 0xF0 Чем вам не спектральная характеристика? В общем-то, этот прием является одной из модификаций преобразования Фурье над дискретным рядом. Что, собственно, вам и надо. Дополнительно могу подсказать вот что: Чем отличается один шаблон от другого? Да собственно ничем... Частотой только (это только в вашем случае). Это значит, что можно хранить один шаблон, правда, высокой точности. Надо будет всего лишь "выбирать" из него с нужным шагом, а не последовательно. И, хотя это излишество, но оно вам позволит сильно сэкономить в памяти. Думаю, вам достаточно вводных данных для начала. Методу надо минимальное количество ОЗУ, а так же вычисления только с фиксированной точкой. Atmega справится - точно. Сергей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Недавно, после совещания, шеф потребовал "добавить" спектральный агнализ принимаемого сигнала (не реал-тайм). Я даже не представляю как подойти к этому вопросу. Буду балгодарен за любую помощь в этом вопросе. P.S. Фурье в ATmega32... Кажется абсурдом. Может быть пригодится - http://elm-chan.org/works/akilcd/report_e.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба При использовании ядра AVR максимум, по моим оценкам, что можно сделать это реализовать два десятка цифровых фильтров второго порядка при выборке 8кГц и сигнале 10-14 бит. При условии что фильтра будут с фиксированными коэффициентами построенными по двоичному ряду и выполнены на сдвигах и сложениях. То есть жёстко заданными коэффициентами. При условии, что больше проц ни чем не занят. Собственно под задачи ЦОС и создавались DSP процы. Так что не удивительно, что на дешёвом RISK ядре это сделать не удаётся. Есть 2 варианта. 1 - уменьшать частоту выборки до безобразно низких величин. 2 - сбрасывать кусок выборки, а потом медленно его обрабатывать. И в 1 и во 2 случае качество оценки сигнала серьёзно страдает по понятным причинам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAHOO 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба по моему надо сначало в MATLAB е попробовать а потом на микроконтроллер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ssvSerge 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Так что не удивительно, что на дешёвом RISK ядре это сделать не удаётся. У человека, похоже, особый случай. Ему обработка в реальном масштабе времени просто не нужна. Поэтому есть возможность записать данные за отрезок времени (не знаю сколько секунда - две - три или всего несколько отсчетов) и потом реализовывать анализ сохраненных данных. В этом случае применение фильтров попросту не оправдано. Можно обойтись более дешевыми и медленными методами. Но самое важное при этом - найти способ увести все вычисления в область челочисленной математики. Иначе действительно ядра AVR попросту не хватит. Сергей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 28 января, 2009 Опубликовано 28 января, 2009 (изменено) · Жалоба Мои советы: 1) Если есть возможность, не заморачиваться с float-арифметикой. Особенно, если исходные данные у вас целые (например, измерения АЦП), вам нужна лишь оценка частотного спектра и вы не собираетесь делать ему обратное FFT-преобразование. В этом случае лучше всего создать ЦЕЛОЧИСЛЕННУЮ таблицу синусов, содержащую столько же ячеек, сколько и в буфере данных, которые будут подвергнуты преобразованию (то и другое - массивы, кратные целой степени двойки: 64, 128, 256, 1024, 2048 и т.д.). Однйо этой таблицы достаточно, чтобы все значения синусов и синусов, необходмые для вычислений, можно было выбрать из нее. Для большинства целей бывает достаточно массива синусов с ячейкой типа char (1 байт). При этом синус нормируется на величину +-128 (signed char). Поскольку максимальные пределы синуса лежат в интервале от -1 до +1, то достаточно значение синуса для угла i*360/n градусов (где i-номер элемента массива) умножить на 128, а затем округлить до БЛИЖАЙШЕГО целого. Эту таблицу прошить во flash, чтобы не тратить под нее оперативку. Есть вариаты нормировать на 2^15 = 32768, т.е. на MAX_INT, используя массив типа int. Тут точность получится совсем хорошая, но дольше станет умножение. Однако даже этот вариант летает со свистом по сравнению с умножением во float-числах. Теоретически таблицу можно сделать в четверо короче, используя симметрию функции синуса, но тогда станет несколько сложнее алгоритм выборки. 2) Заранее решить, нужна ли вам реальная (косинусная) и мнимая (синусная) части разложения, или вам, как большинству электронщиков, нужно только значение мощности (корень из суммы квадратов дествительной и мнимой амплитуд). Если это так, то существует алгоритм FFT-преобразования, который сразу дает мощность. В противном случае вам придется n-раз исчислять корень квадратный, что неприятно. Изменено 28 января, 2009 пользователем Xenia Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба Если это так, то существует алгоритм FFT-преобразования, который сразу дает мощность. Опустив момент, что такое преобразование не может называться преобразованием Фурье ;) , все же скажу - исходники в студию. А то мы тут в одной теме не так давно корячились, а никто такой сильный алгоритм не подсказал :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба внесу свой голос в общий гомон :) в AVR даже достаточно "больших" моделей всего 4К ОЗУ, это ну при самых суперизворотах (ассемблер) максимум 2048 отсчетов АЦП (при этом на остальную программу ОЗу уже не остается). Не стоит забывать и об этом ограничении... и еще несколько слов о библиотеках Элм-Чена, которые рекомендуют при всяком удобном случае. Я их детально изучал и информирую: процедуры "быстрого" умножения и извлечения корня, написанные им для целочисленной арифметики, на самом деле быстрые, но дают ДИЧАЙШУЮ погрешность! например, 2*2=4, но 2*3=7 и т.д. Погрешность может достигать 30%! Для большого круга "оценочных" задач библиотеки подходят, но говорить о каких-то "измеренческих" задачах, наверное, не стоит... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ursa 0 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба Из практики. На ATMega8 делал расходомер, на входе частота. В диапазоне 4..100 Гц частоту определял по спектру, погрешность 0.2 Гц, время преобразования 3 сек. Потом ушли на ARM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnisimovSlava 0 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба У человека, похоже, особый случай. Ему обработка в реальном масштабе времени просто не нужна. Поэтому есть возможность записать данные за отрезок времени (не знаю сколько секунда - две - три или всего несколько отсчетов) и потом реализовывать анализ сохраненных данных. В этом случае применение фильтров попросту не оправдано. Можно обойтись более дешевыми и медленными методами. Но самое важное при этом - найти способ увести все вычисления в область челочисленной математики. Иначе действительно ядра AVR попросту не хватит. Сергей. Да - реал-тайм действительно не нужен. Надо производить спектральный анализ в диапазоне 0.8...1.8 КГц. Я тут несколько раз прочитал предложенный тобой вариант. И не догоняю каким образом можно определить амплитуду. Либо я чего-либо не догоняю, либо метод просто не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба Надо производить спектральный анализ в диапазоне 0.8...1.8 КГц Полос сколько? А то мы тут недавно изготавливали нечто похожее. С частотой дискретизации 3.2кГц, 32 семпла, т.е. 16 полос с шагом 100Гц от 0 до 1.6кГц. Там реалтайм влегкую. http://electronix.ru/forum/index.php?s=&am...st&p=491456 получение 15ти квадратов мощностей из исходных 32х выборок сигнала занимает 2634 такта Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GDI 0 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба Либо я чего-либо не догоняю, либо метод просто не работает.То что он предлагает есть каноническое Дискретное Преобразование Фурье, при чем там "модификация преобразования" - непонятно. Только умножать надо и на синусы и на косинусы. Умножение на косинус даст вам вещественную составляющую коэффициента фурье, а на синус - мнимую. Амплитуда получается вычислением квадратного корня из суммы квадратов вещественной и мнимой частей, фаза - через арктангенс. ДПФ может иметь преимущество над БПФ только в случае большого количества точек при котором вас интересует какой то узкий диапазон частот, тогда можно умножить только на синусы и косинусы только интересующих вас частот, БПФ же ВСЕГДА считает все частоты, но зато он и быстрее в вычислении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ssvSerge 0 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба То что он предлагает есть каноническое Дискретное Преобразование Фурье при чем там "модификация преобразования" - непонятно. 100% так и есть. Модификация не в преобразовании, а в исполнении. Суть в том, что таблицу для умножений можно держать одну, а не две и не 22. Даже в том случае, когда надо вычислять не одну частоту, а несколько. Лишь бы не спектр. ДПФ может иметь преимущество над БПФ только в случае большого количества точек при котором вас интересует какой то узкий диапазон частот За один раз действительно вычисляется только узкий диапазон частот, а не весь спектр. Если интересует еще одна частота, то надо проводить вычисления второй раз и третий и т.д. Но, если надо вычислять 20 и более частот, то стоит подумать над другими методами. Я бы добавил, еще "при ограниченных вычислительных ресурсах". В частности, в свое время, у нас не получилось реализовать БПФ, в то время как после ДПФ и еще и осталось кое-что. Да и вопрос-то был, насколько я понимаю, не в том что надо делать, а "как". А вообще хочется автору (GDI) поставить плюсик. Жаль тут это не предусмотрено. Сергей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться