Этот пример показывает некоторые из основных шагов, необходимых для разработки и оценки таблицы данных синусоидальной волны для использования в приложениях для синтеза цифровых сигналов во встроенных системах и инструментах генерации произвольных сигналов.
Прямой цифровой синтез аналоговых сигналов в реальном времени с использованием встроенных процессоров и цифровых сигнальных процессоров (DSP), подключенных к цифроаналоговым преобразователям (DAC), становится повсеместным даже в самых маленьких системах. Разработка форм сигналов для использования во встраиваемых системах или лабораторных приборах может быть упрощена с помощью тесной интеграции MATLAB ® и Simulink ®. Можно разработать и проанализировать алгоритм генерации формы сигнала и связанные с ним данные на рабочем столе, прежде чем внедрять его с помощью Simulink ® Coder™ на целевом оборудовании.
Когда это возможно, наиболее точным способом цифрового синтеза синусоидальной волны является вычисление функции sin () полной точности непосредственно для каждого временного шага, сворачивая omega * t в интервал от 0 до 2 * pi. В системах реального времени вычислительная нагрузка обычно слишком велика, чтобы допустить такой подход. Популярным способом обойти это препятствие является использование таблицы значений для аппроксимации поведения функции sin (), либо от 0 до 2 * pi, либо даже полуволновых или четвертьволновых данных для использования симметрии.
Компромиссы для рассмотрения включают в себя эффективность алгоритма, требуемый размер ПЗУ данных и точность/спектральную чистоту реализации. Подобный анализ необходим при выполнении собственных проектов формы сигнала. Только табличные данные и алгоритм поиска не определяют производительность в полевых условиях. Дополнительные соображения, такие как точность и стабильность часов реального времени и цифроаналоговый преобразователь, также необходимы для оценки общей производительности. Toolbox™ обработки сигналов и система DSP Toolbox™ дополнять возможности MATLAB и Simulink для работы в этой области.
Другим популярным способом аппроксимации поведения синусоидальной волны является использование метода аппроксимации CORDIC. CORDIC - аббревиатура от COORDinate Rotation DIgital Computer. Алгоритм CORDIC на основе ротации Givens является одним из наиболее аппаратных алгоритмов, так как требует только итеративных операций shift-add.
Если у вас есть лицензия Fixed-Point Designer, то вы можете увидеть Compute Sine и Cosine Using CORDIC Rotation Kernel (Fixed-Point Designer) для примера аппроксимации CORDIC.
Анализ искажений в этом примере основан на принципах, представленных в «Цифровом синусоидальном синтезе с использованием DSP56001/DSP56002,» Андреаса Хрисафиса, Motorola ® Inc. 1988
Следующие команды создают 256-точечную синусоидальную волну и измеряют ее полное гармоническое искажение при выборке сначала в точках, а затем путем перехода с дельтой 2,5 точки на шаг с использованием линейной интерполяции. Аналогичные вычисления выполняются путем замены синусоидальных значений на синусоидальную аппроксимацию CORDIC. Для частотных приложений спектральная чистота может быть более важной, чем абсолютная ошибка в таблице.
Файл ssinthd.m является основной функцией в этом примере. Используется для вычисления суммарного гармонического искажения (THD) для генерации цифровых синусоидальных волн с интерполяцией или без нее. Этот алгоритм THD работает над целым числом волн для достижения точных результатов. Поскольку размер шага «дельта» равен A/B, и пересекающиеся A-волны попадут во все точки таблицы, по меньшей мере, один раз, что необходимо для точного нахождения среднего 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 показывает более низкий запас погрешности по сравнению с методом линейной интерполяции. Это поле зависит от количества итераций при вычислении аппроксимации сина 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 и Cosine с фиксированной точкой, которые реализуют аппроксимацию функции с помощью линейно интерполированной справочной таблицы, которая использует четвертьволновую симметрию синуса и косинуса. Пример 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 точек за раз, где 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.332863 seconds.

Чтобы взять этот пример дальше, попробуйте различную точность таблицы и количество элементов, чтобы увидеть эффект каждого. Используя приближение CORDIC, попробуйте различное количество итераций, чтобы увидеть влияние на точность и время вычислений. Можно исследовать различные варианты реализации алгоритмов синтеза формы сигнала с помощью автоматического создания кода, доступного в Simulink Coder, и создания производственного кода с помощью Embedded Coder™. Продукты Embedded Target обеспечивают прямое подключение к различным процессорам реального времени и DSP, включая обратное подключение к схеме Simulink во время работы целевого устройства в режиме реального времени. Инструментальные средства обработки сигналов и системные инструментальные средства DSP предоставляют предварительно укомплектованные возможности для проектирования и реализации широкого спектра систем обработки сигналов на основе образцов и кадров с MATLAB и Simulink.
bdclose('sldemo_tonegen'); bdclose('sldemo_tonegen_fixpt')