Цифровая Генерация сигналов: аппроксимация Sine wave

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

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

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

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

Другой популярный способ аппроксимации поведения синусоиды - использовать метод CORDIC приближения. CORDIC - это аббревиатура для COordinate Rotation DIgital Computer. Алгоритм CORDIC на основе вращения Givens является одним из наиболее аппаратно эффективных алгоритмов, потому что он требует только итерационных операций сдвига-добавления.

Если у вас есть лицензия Fixed- Точки Designer, то вы можете увидеть Compute Sine и Cosine Using CORDIC Rotation Kernel (Fixed-Point Designer) для примера на приближение CORDIC.

Анализ искажений в этом примере основан на принципах, представленных в «Цифровом синтезе Sine wave с использованием DSP56001/DSP56002,» Andreas Chrysafis, Motorola ® Inc. 1988

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

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

Файл ssinthd.m является основной функцией в этом примере. Он используется для вычисления общего гармонического искажения (THD) для генерации цифровой синусоиды с интерполяцией или без. Этот алгоритм THD протекает по интегральному числу волн, чтобы достичь точных результатов. Количество используемых волновых циклов является A. Поскольку размер шага 'delta' является 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

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

Можно поместить синусоиду, разработанную выше, в модель Simulink и увидеть, как она работает как прямой поиск, с линейной интерполяцией и с приближением CORDIC. Эта модель сравнивает выход таблиц с плавающей точкой с функцией sin (). Как ожидалось из вычислений THD, линейная интерполяция имеет более низкую ошибку, чем прямой поиск таблицы по сравнению с функцией sin (). CORDIC- приближения показывает более низкий запас по ошибкам по сравнению с линейным методом интерполяции. Это поле зависит от количества итераций при вычислении приближения CORDIC sin. Обычно можно достичь большей точности, увеличив количество итераций (соответствующее более длительному времени расчета). 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

Использование предварительно настроенных блоков Sine wave

Simulink также включает исходный блок Sine Wave с непрерывным и дискретным режимами плюс функциональные блоки 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™. Целевые процессоры обеспечивают прямые соединения с различными процессорами в реальном времени и DSP, включая подключение к схеме Simulink, в то время как цель работает в реальном времени. Signal Processing Toolbox и DSP System Toolbox предлагают предустановленные возможности для разработки и реализации широкого спектра основанных на выборке и основанных на кадрах систем обработки сигналов с MATLAB и Simulink.

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