Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Нужно сделать ЧМ сигнал на выходе ЦАП контроллера ADuC842 (оцифровка 8 кГц) (+)

Отправлено Хрюндель 26 марта 2007 г. 12:02


для передачи через динамик и далее по телефонной линии.
Сам сигнал, который модулирует несущую 1900 Гц, представляет из себя цифровые отсчёты с частотой 500 Гц, которые были предварительно записаны во внешнюю флэш память и получены с АЦП контроллера.
Т.к. частота сигнала в 16 раз меньше чатоты ЦАП, то промежуточные отсчёты рассчитываются линейной интерполляцией между двумя соседними отсчётами.
Алгоритм на языке Си приведён ниже. Там подразумеваются константы:
FM_CONST1 = 2PI*FM_FREQUENCY/DAC_FREQUENCY (FM_FREQUENCY - частота несущей ЧМ, DAC_FREQUENCY = 8000 Гц);
FM_CONST2 = 2PI*FM_DEVIATION/DAC_FREQUENCY (FM_DEVIATION - частота девиации, взята пока 200 Гц, но м.б. и больше);
NumSamples = количество отсчётов входного сигнала (с частотой 500 Гц);
FM_RATIO = 16 (отношение DAC_FREQUENCY к частоте модулирующих отсчётов 500 Гц);
flash и flash_next - отсчёты входного сигнала (текущий и следующий), считанные из памяти.

long i;
float arg = -FM_CONST1;
int flash = flash_read_byte_first();
for(i = 0; i < NumSamples - 1; i++)
{
float constA, constB;
int n;
int flash_next = flash_read_byte_next();
constA = FM_CONST1 + FM_CONST2 * (float) flash;
constB = FM_CONST2 * ((float)(flash_next - flash) / FM_RATIO);
flash = flash_next;
for(n = 0; n < FM_RATIO; n++)
{
int dac;
arg += constA + constB * (float) n;
dac = (int)(FM_DAC_SCALE * sinus(arg));
DAC_OUT(dac);
}
}

Собственно вопрос вот в чём - контроллер не успевает рассчитывать в реальном времени. Надо бы скорость поднять как минимум в 2-3 раза. Потери времени главным образом происходят при расчёте синуса и вычислениях с float. Синус сделан табличный, но т.к. алгоритм всё время накапливает значение аргумента синуса, то оно может несколько раз проходить целый круг, поэтому в синусе приходится ещё приводить аргумент к заданным "воротам", на что и уходит основное время (ведь расчёт делается во float). А без float сделать сложно (м.б. набег ошибки), да и будет ли быстрее - не факт (т.к. придётся делать с 32-битными целыми в 8-битном контроллере). Например, цифровой фильтр 2-taps я делал и в целой и во float, и оказалось, что во float работает быстрее (не говоря уже о том, что точнее).
Что предпринять?
Можно, допустим, сделать меньше частоту ЦАП, скажем, до 6 кГц. Но этого ведь недостаточно.
Может есть другой алгоритм формирования ЧМ? Без синуса или без выхода аргумента за 2PI?

Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

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

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru