Этот пример показывает, что некоторые основные шаги должны были разработать и оценить таблицу данных синусоиды для использования в цифровых приложениях синтеза формы волны во встраиваемых системах и произвольных инструментах генерации формы волны.
Прямой цифровой синтез в реальном времени аналоговых форм волны с помощью встраиваемых процессоров и цифровых сигнальных процессоров (DSPS), соединенный с цифро-аналоговыми преобразователями (DACs), становится распространяющимся даже в самых маленьких системах. Разработка форм волны для использования во встраиваемых системах или лабораторных инструментах может быть оптимизирована с помощью тесной интеграции MATLAB® и Simulink®. Можно разработать и анализировать алгоритм генерации формы волны и его связанные данные в рабочем столе прежде, чем реализовать его с Simulink® Coder™ на целевом компьютере.
Когда выполнимо, самый точный способ в цифровой форме синтезировать синусоиду состоит в том, чтобы вычислить грех полной точности () функция непосредственно для каждого временного шага, свернувшись omega*t на интервал 0 к 2*pi. В режиме реального времени системы, вычислительная нагрузка является обычно слишком большой, чтобы разрешить этот подход. Один популярный путь вокруг этого препятствия состоит в том, чтобы использовать таблицу значений, чтобы аппроксимировать поведение греха () функция, или от 0 до 2*pi, или даже половина волны или данных волны четверти, чтобы усилить симметрию.
Компромиссы, чтобы рассмотреть включают эффективность алгоритма, данные размер ROM, требуемый, и чистота точности / спектральная чистота реализации. Подобный анализ необходим при выполнении собственных проектов формы волны. Табличные данные и один только алгоритм поиска не определяют производительность в поле. Дополнительные факторы, такие как точность и устойчивость час реального времени и цифро-аналоговый преобразователь также необходимы в порядке оценить общую производительность. Обработка сигналов Toolbox™ и Система DSP 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. Эта модель сравнивает вывод таблиц с плавающей точкой к греху () функция. Как ожидалось от вычислений THD, линейная интерполяция имеет более низкую ошибку, чем прямой поиск по таблице по сравнению с грехом () функция. Приближение CORDIC показывает более низкий допуск на погрешность когда по сравнению с методом линейной интерполяции. Это поле зависит от количества итераций при вычислении приближения греха CORDIC. Можно обычно достигать большей точности путем увеличения числа итераций (соответствующий более длительному времени вычисления). Приближение CORDIC избавляет от необходимости явные множители. Это используется, когда множители менее эффективны или не существуют в аппаратных средствах.
Откройте sldemo_tonegen модель
open_system('sldemo_tonegen'); set_param('sldemo_tonegen', 'StopFcn',''); sim('sldemo_tonegen'); currentFig = figure('Color',[1,1,1]); subplot(3,1,1), plot(tonegenOut.time, tonegenOut.signals(1).values); grid title({'Difference between direct look-up', 'and reference signal'}); subplot(3,1,2), plot(tonegenOut.time, tonegenOut.signals(2).values); grid title({'Difference between interpolated look-up', 'and reference signal'}); subplot(3,1,3), plot(tonegenOut.time, 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 также включает исходный блок Синусоиды с непрерывными и дискретными режимами плюс блоки Греха и Косинусной функции фиксированной точки, которые реализуют функциональное приближение с линейно интерполированной интерполяционной таблицей, которая использует симметрию волны четверти синуса и косинуса. Пример sldemo_tonegen_fixpt использует выбранный источник синусоиды в качестве ссылочного сигнала и сравнивает его с интерполяционной таблицей с или без интерполяции, и с приближением синуса CORDIC в типах данных фиксированной точки.
Откройте sldemo_tonegen_fixpt модель
open_system('sldemo_tonegen_fixpt'); set_param('sldemo_tonegen_fixpt', 'StopFcn',''); sim('sldemo_tonegen_fixpt'); figure('Color',[1,1,1]); subplot(3,1,1), plot(tonegenOut.time, tonegenOut.signals(1).values); grid title({'Difference between direct look-up', 'and reference signal'}); subplot(3,1,2), plot(tonegenOut.time, tonegenOut.signals(2).values); grid title({'Difference between interpolated look-up', 'and reference signal'}); subplot(3,1,3), plot(tonegenOut.time, tonegenOut.signals(3).values); grid title({'Difference between CORDIC sine', 'and reference signal'});
Модель также сравнивает исходную ссылку синусоиды с грехом () функция, входной угол которой в радианах время базирующийся (вычисленное использование часов). Этот раздел тестирует предположение, что входной параметр часов возвратил бы повторяемые результаты греха () функция в течение периода 2*pi. Следующий график показывает, что грех () функция накапливает ошибку, когда ее входной параметр время базирующийся. Это также показывает, что выбранный источник синусоиды больше с точностью до использования в качестве генератора формы волны.
subplot(1,1,1), plot(tonegenOut.time, 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 1.260508 seconds.
Чтобы взять этот пример далее, попробуйте различную табличную точность и количества элемента, чтобы видеть эффект каждого. Используя приближение CORDIC, попробуйте различные количества итераций, чтобы видеть эффекты на точность и время вычисления. Можно исследовать различные опции реализации для алгоритмов синтеза формы волны с помощью автоматической генерации кода, доступной от Simulink Coder и генерации производственного кода с помощью Embedded Coder™. Продукты Целевого процессора предлагают прямые связи со множеством процессоров в реальном времени и DSPS, включая связь назад со схемой Simulink, в то время как цель запускается в режиме реального времени. Signal Processing Toolbox и DSP System Toolbox предлагают предварительно группированные возможности разработки и реализации большого разнообразия основанных на выборке и основанных на кадре систем обработки сигналов с MATLAB и Simulink.
bdclose('sldemo_tonegen'); bdclose('sldemo_tonegen_fixpt')