|
Генератор синуса на FPGA Altera |
|
|
|
Aug 29 2011, 12:44
|
Местный
  
Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893

|
Цитата(iosifk @ Aug 29 2011, 16:32)  На самом деле, Вам нужна в таблице четвертинка периода, да и то, не полный синус, а разница между синусом и линейной частью. Спасибо, я это всё понимаю, но мне нужно 18 каналов, т.е. 18 генераторов с определёнными фиксированными характеристиками и высокой точностью, но к сожалению у меня вышел низкоточный т.к. мало точек и линейная интерполяция между ними. Либо высокоточный но не влазит ни по количеству ячеек ни по памяти т.к. нужно место для основного алгоритма. Я хочу найти готовый т.к. не хочу тратить время, и не вижу сысла вести исследования ради отладочной функции (с тем же успехом можно наделать пилу но с помощью её ряд ошибок в каналах данных и мультиплексорах не проверишь), в добавок мне не требуется мегаскорость. Достаточно 100кГц за глаза. Мне интересно как это сделать и как получить быстро результат не потратив кучу времени на изучение интерполяций и способов и разрабатывая самому генератор его ещё нужно проверять и тд. Интереснее готовый или из минимального числа готовых блоков. Как впихнуть в 7.5к бит памяти и 9к ячеек 18 более менее точных 16 битных генераторов выборок синусов затратив максимум неделю, вот в чём вопрос.
Сообщение отредактировал Porty - Aug 29 2011, 12:47
|
|
|
|
|
Aug 29 2011, 12:46
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 9-09-08
Из: РФ
Пользователь №: 40 076

|
Цитата(iosifk @ Aug 29 2011, 16:32)  На самом деле, Вам нужна в таблице четвертинка периода... И как с её помощью получить "генератор отсчётов синусов произвольной частоты внутри ПЛИС с периодом не кратным целому числу и степени двойки" ? Или к табличке ещё и Фэрроу прилагается?
|
|
|
|
|
Aug 29 2011, 12:51
|
Местный
  
Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893

|
Цитата(=SSN= @ Aug 29 2011, 16:46)  И как с её помощью получить "генератор отсчётов синусов произвольной частоты внутри ПЛИС с периодом не кратным целому числу и степени двойки" ?
Или к табличке ещё и Фэрроу прилагается? получить можно, и я ошибся - нужны любые фиксированные частоты так чтоб выборки как можно дольше не повторялись. Смысл отладки такой таблицей в том что если в каналах связи потеряется пакет любой длинны в любом положении фазы, то ФФТ на это среагировало и резко подпрыгнули боковые лепестки или выскочили побочные гармоники и прочие артифакты (выше 100дб) и была возможность продетектировать это. Если сигнал берётся из таблицы темболее степени двойки то большой шанс того что период целиком выпадет и на ФФТ это не продетектируется.
Сообщение отредактировал Porty - Aug 29 2011, 12:51
|
|
|
|
|
Aug 29 2011, 13:14
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 9-09-08
Из: РФ
Пользователь №: 40 076

|
Цитата(Porty @ Aug 29 2011, 16:51)  нужны любые фиксированные частоты так чтоб выборки как можно дольше не повторялись. А решить систему дифференциальных уравнений: W*cos(Wt) = sin(Wt)' W*sin(Wt) = -cos(Wt)' в фиксированной арифметике никак не получится? Или CORDIC на ПЛИС?
|
|
|
|
|
Aug 29 2011, 13:38
|
Знающий
   
Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107

|
Нда... Количество советов по вариантам цифровой генерации синуса скоро превысит число доказательств теоремы Пифагора  Вот самый простой способ, описан тут: http://www.ti.com/lit/an/spra096a/spra096a.pdf, раздел A.1 на странице 16. Для совсем ленивых описываю суть алгоритма: y(i+1) = 2*cos(phi)*y(i) - y(i-1), где: y(i) - последовательность целочисленных значений синусоиды cos(phi) - отвечает за частоту, phi - это приращение фазы синусоиды за один период частоты дискретизации. phi = 2*pi*f / f0. начальные значения y(0) и y(-1) определяют фазу и амплитуду генерируемого сигнала. Если на начальную фазу плевать, то подойдут такие значения: y(0) = 0, y(-1) = -A * sin(phi), где А - амплитуда синусоиды. Вы можете выбрать любую разрядность, какую потянут умножители. Единственное, нужно так выбрать частоту дискретизации, чтобы ошибка от округления косинуса до ближайшего целого была не очень большой. например, для очень малого приращения фазы косинус может быть очень близок к 1, и после перевода на целочисленную арифметику ограниченной разрядности давать заметный сдвиг частоты. Если Вам будет жалко тратить целый умножитель на каждый из 18 каналов, то Вы можете организовать конвейер и контексты на большей частоте, которые будут кормить общий умножитель. Контекст каждого канала полностью определяется тремя величинами y(i), y(i-1) и cos(phi), последняя, впрочем, константа и допускает некоторую оптимизацию. Успехов!
|
|
|
|
|
Aug 29 2011, 16:48
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата(=SSN= @ Aug 29 2011, 16:46)  И как с её помощью получить "генератор отсчётов синусов произвольной частоты внутри ПЛИС с периодом не кратным целому числу и степени двойки" ? Дык... "Просто"... Текущую фазу сигнала "произвольной частоты" грузить в табличку, а выгружать амплитуду сигнала "произвольной частоты". И так стопицот тыщ раз в секунду.
|
|
|
|
|
Aug 30 2011, 07:23
|
Местный
  
Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893

|
Цитата(Hoodwin @ Aug 29 2011, 17:38)  Нда... Количество советов по вариантам цифровой генерации синуса скоро превысит число доказательств теоремы Пифагора  Вот самый простой способ, описан тут: http://www.ti.com/lit/an/spra096a/spra096a.pdf, раздел A.1 на странице 16. Для совсем ленивых описываю суть алгоритма: y(i+1) = 2*cos(phi)*y(i) - y(i-1), где: y(i) - последовательность целочисленных значений синусоиды cos(phi) - отвечает за частоту, phi - это приращение фазы синусоиды за один период частоты дискретизации. phi = 2*pi*f / f0. начальные значения y(0) и y(-1) определяют фазу и амплитуду генерируемого сигнала. Если на начальную фазу плевать, то подойдут такие значения: y(0) = 0, y(-1) = -A * sin(phi), где А - амплитуда синусоиды. Вы можете выбрать любую разрядность, какую потянут умножители. Единственное, нужно так выбрать частоту дискретизации, чтобы ошибка от округления косинуса до ближайшего целого была не очень большой. например, для очень малого приращения фазы косинус может быть очень близок к 1, и после перевода на целочисленную арифметику ограниченной разрядности давать заметный сдвиг частоты. Если Вам будет жалко тратить целый умножитель на каждый из 18 каналов, то Вы можете организовать конвейер и контексты на большей частоте, которые будут кормить общий умножитель. Контекст каждого канала полностью определяется тремя величинами y(i), y(i-1) и cos(phi), последняя, впрочем, константа и допускает некоторую оптимизацию. Успехов! Спасибо, эта штука заработала, и как я только умудрился забыть то что сдавал давным давно в универе когда только пришли комплекты "Умка" на базе КР580, я тогда с преподом наспор за зачот сделал расчёт таблицы синусов по этой итерационной формуле ньютона если не ошибаюсь с названием. Штука заработала но я не осилил расчёт погрешностей статических и динамических в итоге чуток частота плавает и не точно задаётся, например задал pi*200 = 628.318531Hz, а вышла pi*203=637.743309Hz в арифметике с фикс. запятой 16/16. 16 бит на числа после запятой по идее должно хватить, странно что частота не точно выставлена оказалось, умножитель 64 битный, округляю правильно по правилам арифметики округления.
|
|
|
|
|
Aug 30 2011, 08:37
|
Знающий
   
Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107

|
1. Вообще, насколько я себе представляю, 16 разрядов мало для 110 дБ. Вот вроде бы по науке соотношение сигнал/ошибка будет, если правильно помню, порядка 2 дБ + 6 дБ * N, где N - число разрядов. Как следствие, 16 разрядов дадут что-то около 98 дБ, а для 110 нужно не менее 18 разрядов. Я бы сделал для подстраховки разрядов 20, чтобы иметь небольшой запас на точность вычислений.
2. Так частота "плавает" или просто неточно задается? Как я уже написал, нужно так выбрать частоту дискретизации, чтобы у сигнала был ощутимый набег фазы, порядка 45-60 градусов. В этом случае округление значения косинуса не приведет к заметным изменениям задающей частоты. Чтобы было понятнее, поясню на примере. Вот есть частота синусоиды 200 Гц. А частота дискретизации, скажем, 56000 Гц. cos(2*pi*200/56000) будет 0,999748235. Приведение к Q0.16 даст 65519,50033. Обрезание до целого даст 65519, что эквивалентно значению косинуса 0,999740601, или исходной частоте 203,0098173 Гц.
Если все то же самое проделать с частотой дискретизации 1600 Гц, на которой 200 Гц дает набег фазы в 1/8 периода, то частота составит 200,0052204 Гц. Если же взять частоту под набег фазы в 1/6 периода, 1200 Гц, то косинус будет равен половинке и вообще не даст погрешности.
так как у Вас достаточно широкий диапазон синтезируемых частот, то целесообразно сделать несколько кратных частот дискретизации, близких к синтезируемым, исходя из указанного соображения.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|