Цифровая генерация формы волны: приближение синусоиды

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

Прямой цифровой синтез в реальном времени аналоговых форм волны с помощью встраиваемых процессоров и цифровых сигнальных процессоров (DSPS), соединенный с цифро-аналоговыми преобразователями (DACs), становится распространяющимся даже в самых маленьких системах. Разработка форм волны для использования во встраиваемых системах или лабораторных инструментах может быть оптимизирована с помощью тесной интеграции MATLAB® и Simulink®. Можно разработать и анализировать алгоритм генерации формы волны и его связанные данные в рабочем столе прежде, чем реализовать его с Simulink® Coder™ на целевом компьютере.

Когда выполнимо, самый точный способ в цифровой форме синтезировать синусоиду состоит в том, чтобы вычислить sin полной точности () функция непосредственно для каждого временного шага, свернувшись omega*t на интервал 0 к 2*pi. В режиме реального времени системы, вычислительная нагрузка является обычно слишком большой, чтобы разрешить этот подход. Один популярный путь вокруг этого препятствия состоит в том, чтобы использовать таблицу значений, чтобы аппроксимировать поведение sin () функция, или от 0 до 2*pi, или даже половина волны или данных о волне четверти, чтобы усилить симметрию.

Компромиссы, чтобы рассмотреть включают эффективность алгоритма, данные размер ROM, требуемый, и чистота точности / спектральная чистота реализации. Подобный анализ необходим при выполнении собственных проектов формы волны. Табличные данные и один только алгоритм поиска не определяют производительность в поле. Дополнительные факторы, такие как точность и устойчивость час реального времени и цифро-аналоговый преобразователь также необходимы в порядке оценить общую производительность. Signal Processing Toolbox™ и DSP System Toolbox™ дополняют возможности MATLAB и Simulink для работы в этой области.

Другой популярный способ аппроксимировать поведение синусоиды состоит в том, чтобы использовать метод приближения CORDIC. CORDIC является акронимом для Координатного Компьютера Вращения. Основанный на вращении алгоритм CORDIC Givens среди одного из самых эффективных оборудованием алгоритмов, потому что это требует только shift-add итеративных операций. Если у вас есть лицензия Разработчика Фиксированной точки затем, вы видите fi_sin_cos_demo для учебного примера стиля на приближении CORDIC.

Анализ искажения в этом примере основан на принципах, представленных в "Цифровом Синтезе Синусоиды Используя DSP56001/DSP56002", Андреасом Хризафисом, Motorola® Inc. 1988

Составьте таблицу в плавающей точке двойной точности

Следующие команды делают 256 синусоид точки и измеряют ее общее гармоническое искажение, когда выбрано сначала на точках и затем путем перехода с дельтой 2,5 точек на шаг с помощью линейной интерполяции. Подобные вычисления сделаны, заменив значения синуса с приближением синуса CORDIC. Для основанных на частоте приложений спектральная чистота может быть более важной, чем абсолютная погрешность в таблице.

Файл ssinthd.m является базовой функцией в этом примере. Это используется для вычисления общего гармонического искажения (THD) для цифровой генерации синусоиды с или без интерполяции. Этот алгоритм THD продолжает по целому числу волн достигать точных результатов. Количество используемых циклов волны является A. Поскольку размер шага 'дельта' является A/B и пересечением, волны поразят все точки в таблице по крайней мере в один раз, которая необходима, чтобы точно найти средний THD через полный цикл.

Отношение, используемое, чтобы вычислить THD:

    THD = (ET - EF) / ET

где ET = полная энергия и EF = основная энергия

Разностью энергий между ET и EF является побочная энергия.

N     = 256;
angle =  2*pi * (0:(N-1))/N;

s     = sin( angle )';
thd_ref_1    = ssinthd( s,   1,   N, 1, 'direct' )
thd_ref_2p5  = ssinthd( s, 5/2, 2*N, 5, 'linear' )

cs    = cordicsin( angle, 50 )';
thd_ref_1c   = ssinthd(cs,   1,   N, 1, 'direct' )
thd_ref_2p5c = ssinthd(cs, 5/2, 2*N, 5, 'linear' )
thd_ref_1 =

   4.7198e-32


thd_ref_2p5 =

   1.4176e-09


thd_ref_1c =

   1.2544e-30


thd_ref_2p5c =

   1.4176e-09

Поместите приближения синусоиды в модель

Можно поместить синусоиду, разработанную выше в модель Simulink, и видеть, как она работает прямым поиском с линейной интерполяцией, и с приближением CORDIC. Эта модель сравнивает вывод таблиц с плавающей точкой к sin () функция. Как ожидалось от вычислений THD, линейная интерполяция имеет более низкую ошибку, чем прямой поиск по таблице по сравнению с sin () функция. Приближение CORDIC показывает более низкий допуск на погрешность когда по сравнению с методом линейной интерполяции. Это поле зависит от количества итераций при вычислении приближения sin CORDIC. Можно обычно достигать большей точности путем увеличения числа итераций (соответствующий более длительному времени вычисления). Приближение CORDIC избавляет от необходимости явные множители. Это используется, когда множители менее эффективны или не существуют в оборудовании.

Откройте sldemo_tonegen модель

open_system('sldemo_tonegen');
set_param('sldemo_tonegen', 'StopFcn','');
out = sim('sldemo_tonegen');
currentFig = figure('Color',[1,1,1]);
subplot(3,1,1), plot(out.tonegenOut.time, out.tonegenOut.signals(1).values); grid
title({'Difference between direct look-up', 'and reference signal'});
subplot(3,1,2), plot(out.tonegenOut.time, out.tonegenOut.signals(2).values); grid
title({'Difference between interpolated look-up', 'and reference signal'});
subplot(3,1,3), plot(out.tonegenOut.time, out.tonegenOut.signals(3).values); grid
title({'Difference between CORDIC sine', 'and reference signal'});

Более тщательно изучение в точности формы волны

Увеличивая масштаб сигналов между 4,8 и 5,2 секундами времени симуляции (например), вы видите различную характеристику из-за различных используемых алгоритмов:

ax = get(currentFig,'Children');
set(ax(3),'xlim',[4.8, 5.2])
set(ax(2),'xlim',[4.8, 5.2])
set(ax(1),'xlim',[4.8, 5.2])

Та же таблица, реализованная в фиксированной точке

Теперь преобразуйте таблицу с плавающей точкой в дробный номер на 24 бита с помощью 'самого близкого' округления. Новая таблица тестируется на общее гармоническое искажение в прямом режиме поиска в 1, 2, и 3 точки на шаг, затем с линейной интерполяцией фиксированной точки.

bits = 24;
is   = num2fixpt( s, sfrac(bits), [], 'Nearest', 'on');

thd_direct1 = ssinthd(is, 1, N, 1, 'direct')
thd_direct2 = ssinthd(is, 2, N, 2, 'direct')
thd_direct3 = ssinthd(is, 3, N, 3, 'direct')

thd_linterp_2p5 = ssinthd(is, 5/2, 2*N, 5, 'fixptlinear')
thd_direct1 =

   2.6423e-15


thd_direct2 =

   2.8660e-15


thd_direct3 =

   2.6423e-15


thd_linterp_2p5 =

   1.4175e-09

Сравните результаты для различных таблиц и методов

При выборе табличного уровня шага 8,25 точек на шаг (33/4) перейдите через двойную точность и таблицы фиксированной точки и в прямых и в линейных режимах и сравните результаты искажения:

thd_double_direct  = ssinthd( s, 33/4, 4*N, 33, 'direct')
thd_sfrac24_direct = ssinthd(is, 33/4, 4*N, 33, 'direct')

thd_double_linear  = ssinthd( s, 33/4, 4*N, 33, 'linear')
thd_sfrac24_linear = ssinthd(is, 33/4, 4*N, 33, 'fixptlinear')
thd_double_direct =

   4.7061e-05


thd_sfrac24_direct =

   4.7061e-05


thd_double_linear =

   7.9741e-10


thd_sfrac24_linear =

   8.1751e-10

Используя предварительно сконфигурированные блоки синусоиды

Simulink также включает исходный блок Синусоиды с непрерывными и дискретными режимами плюс блоки Sin и Косинусной функции фиксированной точки, которые реализуют приближение функций с линейно интерполированной интерполяционной таблицей, которая использует симметрию волны четверти синуса и косинуса. Пример sldemo_tonegen_fixpt использует выбранный источник синусоиды в качестве ссылочного сигнала и сравнивает его с интерполяционной таблицей с или без интерполяции, и с приближением синуса CORDIC в типах данных фиксированной точки.

Откройте sldemo_tonegen_fixpt модель

open_system('sldemo_tonegen_fixpt');
set_param('sldemo_tonegen_fixpt', 'StopFcn','');
out = sim('sldemo_tonegen_fixpt');
figure('Color',[1,1,1]);
subplot(3,1,1), plot(out.tonegenOut.time, out.tonegenOut.signals(1).values); grid
title({'Difference between direct look-up', 'and reference signal'});
subplot(3,1,2), plot(out.tonegenOut.time, out.tonegenOut.signals(2).values); grid
title({'Difference between interpolated look-up', 'and reference signal'});
subplot(3,1,3), plot(out.tonegenOut.time, out.tonegenOut.signals(3).values); grid
title({'Difference between CORDIC sine', 'and reference signal'});

Использование синусоидальной функции с входом часов

Модель также сравнивает исходную ссылку синусоиды с sin () функция, входной угол которой в радианах является базирующимся временем (вычисленное использование часов). Этот раздел тестирует предположение, что вход часов возвратил бы повторяемые результаты sin () функция в течение периода 2*pi. Следующий график показывает, что sin () функция накапливает ошибку, когда ее вход является базирующимся временем. Это также показывает, что выбранный источник синусоиды больше с точностью до использования в качестве генератора формы волны.

subplot(1,1,1), plot(out.tonegenOut.time, out.tonegenOut.signals(4).values); grid
title({'Difference between time based sin()', 'and reference signal'});

Обзор поведения для прямого поиска и линейной интерполяции

Файл sldemo_sweeptable_thd.m выполняет полную развертку частоты таблиц фиксированной точки и позволит нам более тщательно понять поведение этого проекта. Общее гармоническое искажение 24-битной дробной таблицы фиксированной точки измеряется в каждом размере шага, перемещающийся через это было бы точки за один раз, где D является номером от 1 до N/2, постепенно увеличивающегося 0,25 точками. N является 256 точками в этом примере; 1, 2, 2.5, и 3 случая был сделан выше. Частота дискретна и поэтому функция частоты дискретизации.

Заметьте режимы поведения искажения в графике. Они соответствуют со здравым смыслом: при получении из таблицы точно в точке, ошибка является самой маленькой; линейная интерполяция имеет меньшую ошибку, чем прямой поиск промежуточные точки. То, что не интуитивно, - то, что ошибка является относительно постоянной для каждого из режимов до частоты Найквиста.

figure('Color',[1,1,1])
tic, sldemo_sweeptable_thd(24, 256), toc
Elapsed time is 0.675055 seconds.

Следующие шаги

Чтобы взять этот пример далее, попробуйте различную табличную точность и количества элемента, чтобы видеть эффект каждого. Используя приближение CORDIC, попробуйте различные количества итераций, чтобы видеть эффекты на точность и время вычисления. Можно исследовать различные опции реализации для алгоритмов синтеза формы волны с помощью автоматической генерации кода, доступной от Simulink Coder и генерации производственного кода с помощью Embedded Coder™. Продукты Целевого процессора предлагают прямые связи со множеством процессоров в реальном времени и DSPS, включая связь назад со схемой Simulink, в то время как цель запускается в режиме реального времени. Signal Processing Toolbox и DSP System Toolbox предлагают предварительно группированные возможности разработки и реализации большого разнообразия основанных на выборке и основанных на кадре систем обработки сигналов с MATLAB и Simulink.

bdclose('sldemo_tonegen');
bdclose('sldemo_tonegen_fixpt')