dsp.HDLNCO

Сгенерируйте действительные или сложные синусоидальные сигналы - оптимизированные для генерации HDL-кода

Описание

HDL NCO System object™ генерирует реальные или сложные синусоидальные сигналы, обеспечивая при этом аппаратные сигналы управления. Объект использует тот же алгоритм накопления фазы и интерполяционной таблицы, что и реализованный в объекте NCO System. Объект использует квантованное целочисленное накопление, чтобы создать синусоидальный сигнал.

Объект HDL NCO System предоставляет эти функции.

  • Необязательный выход на основе фрейма.

  • Опция сжатия интерполяционной таблицы для уменьшения размера интерполяционной таблицы. Это сжатие приводит к менее чем одной потере LSB в точности. Дополнительные сведения см. в разделе Сжатие интерполяционной таблицы.

  • Необязательный входной параметр для внешнего dither.

  • Необязательный аргумент сброса, который устанавливает начальное значение аккумулятора фазы.

  • Необязательный выходной аргумент для текущей фазы NCO.

Учитывая шаг расчета, T с, и желаемое разрешение выходной частоты, Δf, вычислите необходимый размер аккумулятора Nacc=ceil(log2(1TsΔf)).

Принимая, что ваша необходимая выходная частота F o намного ниже частоты Найквиста, можно использовать приближение для шума на бит в дБ, основанную на паразитной свободной динамической области значений (SFDR), и определить, сколько можно квантовать выход аккумулятора. Квантованный размер слова для достижения заданного SFDR Nq=ceil(SFDR126).

Для желаемой выходной частоты F o, вычислите phase increment используяphase increment=round(F0Ts2Nacc), где Nacc - квантованный размер слова аккумулятора. Можно задать шаг фазы с помощью свойства или входного параметра.

Учитывая желаемое смещение фазы (в радианах), вычислите phase offset используяphase offset=2Naccdesired phase offset2π. Можно задать смещение фазы с помощью свойства или входного параметра.

Чтобы сгенерировать действительные или комплексные синусоидальные сигналы:

  1. Создайте dsp.HDLNCO Объекту и установите его свойства.

  2. Вызывайте объект с аргументами, как будто это функция.

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

Создание

Описание

hdlnco = dsp.HDLNCO создает численно управляемый генератор (NCO) Системного объекта, hdlnco, который генерирует действительный или комплексный синусоидальный сигнал. Амплитуда сгенерированного сигнала всегда равна 1.

пример

hdlnco = dsp.HDLNCO(Name,Value) устанавливает свойства с помощью одной или нескольких пар "имя-значение". Заключайте каждое имя свойства в одинарные кавычки. Для примера,

hdlnco = dsp.HDLNCO('NumQuantizerAccumulatorBits',12, ...
                    'AccumulatorWL',16);

hdlnco = dsp.HDLNCO(Inc,'PhaseIncrementSource','Property') создает NCO с PhaseIncrement значение свойства установлено в Inc, целочисленный скаляр. Чтобы использовать свойство PhaseIncrement, задайте значение свойства PhaseIncrementSource 'Property'. Можно добавить другие Name,Value пары до или после PhaseIncrementSource.

Свойства

расширить все

Примечание

Этот объект поддерживает типы с плавающей точкой для симуляции, но не для генерации HDL-кода. Когда все входные значения являются типами с фиксированной точкой или все входные параметры отключены, объект определяет выходной тип, используя OutputDataType свойство. Когда любое входное значение является типом с плавающей точкой, объект игнорирует OutputDataType свойство. В этом случае объект возвращает форму волны и необязательно Phase как значения с плавающей точкой.

Если не указано иное, свойства являются нетронутыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируются, когда вы вызываете их, и release функция разблокирует их.

Если свойство настраивается, можно изменить его значение в любой момент.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.

Генерация сигналов

Можно задать шаг фазы с помощью входного параметра или путем определения значения для свойства. Задайте 'Property' чтобы сконфигурировать шаг фазы с помощью PhaseIncrement свойство. Задайте 'Input port' чтобы задать шаг фазы с помощью inc аргумент.

Шаг фазы для сгенерированной формы волны, заданный как целое число.

Зависимости

Чтобы включить это свойство, установите PhaseIncrementSource свойство к 'Property'.

Типы данных: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixdt([],N,0)

Можно задать смещение фазы с помощью входного параметра или путем определения значения свойства. Задайте 'Property' чтобы сконфигурировать шаг фазы с помощью PhaseOffset свойство. Задайте 'Input port' чтобы задать шаг фазы с помощью offset аргумент.

Смещение фазы для сгенерированной формы волны, заданное в виде целого числа.

Зависимости

Чтобы включить это свойство, установите PhaseOffsetSource свойство к 'Property'.

Типы данных: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixdt([],N,0)

Можно задать количество dither бит из входного параметра или из свойства, или можно отключить dither. Задайте 'Property' чтобы сконфигурировать количество dither, биты используя NumDitherBits свойство. Задайте 'Input port' чтобы задать количество dither бит с помощью dither аргумент. Задайте 'None' отключить dither.

Количество dither бит, заданное в виде положительного целого числа.

Зависимости

Чтобы включить это свойство, установите DitherSource свойство к 'Property'.

Размер вектора для основанного на кадре выхода, заданный как положительное целое число. Когда вы задаете это значение 1объект имеет скалярный вход и выход. Когда это значение больше 1, а Dither Входные параметры должны быть вектором-столбцом длины SamplesPerFrame и Y и Phase выходные аргументы возвращают векторы-столбцы длины SamplesPerFrame.

Сжатие интерполяционной таблицы, заданное как логическое 0 (false) или 1 (true). По умолчанию объект реализует несжатую интерполяционную таблицу, и выход совпадает с выходом dsp.NCO Системный объект. Когда вы включаете эту опцию, объект реализует сжатую интерполяционную таблицу. Метод сжатия Сандерленда уменьшает размер интерполяционной таблицы, теряя менее одного LSB точности. Паразитная свободная динамическая область значений (SFDR) эмпирически на 1-3 дБ ниже, чем несжатый случай. Аппаратная экономия сжатой интерполяционной таблицы позволяет комнате улучшить эффективность путем увеличения размера слова аккумулятора и количества бит квантования. Для получения дополнительной информации о методе сжатия см. «Алгоритмы».

Тип выхода волны. Если вы выбираете 'Sine' или 'Cosine'объект возвращает sin или cos значение. Если вы выбираете 'Complex exponential', значение выхода, exp, имеет форму cosine + j*sine. Если вы выбираете 'Sine and cosine'объект возвращает два значения, sin и cos.

Установите это свойство на 1 (true) для возврата текущей фазы NCO в phase выходной аргумент. Фаза является выходом квантованного аккумулятора с приложенными смещением и шагом. Если квантование отключено, этот аргумент возвращает выход аккумулятора со смещением и шагом.

Когда это свойство 1 (true), объект принимает ResetAccum входной параметр. Когда ResetAccum аргумент 1 (true), объект сбрасывает аккумулятор на его начальное значение.

Типы данных

Это свойство доступно только для чтения.

Режим переполнения для операций с фиксированной точкой.

Это свойство доступно только для чтения.

Режим округления для операций с фиксированной точкой.

Это свойство доступно только для чтения.

Описание типа данных аккумулятора. Объект определяет тип данных с фиксированной точкой с помощью AccumulatorSigned, AccumulatorWL, и AccumulatorFL свойства.

Это свойство доступно только для чтения.

Подписанный или неподписанный формат данных аккумулятора. Все выходы подписаны форматом.

Размер слова аккумулятора, в битах, задаётся в виде целого числа. Это значение должно включать бит знака.

Если на PhaseQuantization свойство 0 (false), это свойство должно быть меньше или равно 17 битам для генерации HDL-кода. В неквантованном случае интерполяционная таблица значений синуса имеет 2AccumulatorWL-2 записи.

Это свойство доступно только для чтения.

Длина дроби аккумулятора, в битах. Аккумулятор работает с целыми числами. Если шаг фазы является типом с фиксированной точкой с дробной частью, объект возвращает ошибку.

Квантовать ли накопленную фазу, задается как 1 (true) или 0 (false). Когда это свойство включено, объект квантует результат накопителя фазы до фиксированной битовой ширины. Это квантованное значение используется для выбора значения формы волны из интерполяционной таблицы. Выберите разрешение интерполяционной таблицы при помощи NumQuantizerAccumulatorBits свойство.

Разрешение частоты NCO определяется Δf=1Ts2NHz, где N является NumQuantizerAccumulatorBits значение свойства.

Когда вы отключаете это свойство, объект использует тип данных аккумулятора в качестве адреса интерполяционной таблицы. В этом случае N является AccumulatorWL значение свойства.

Количество двоичных разрядов аккумулятора квантователя, заданное в виде целого числа, больше 4 и меньше, чем AccumulatorWL значение свойства. Это свойство должно быть меньше или равно 17 битам для генерации HDL-кода. Интерполяционная таблица значений синуса имеет 2NumQuantizerAccumulatorBits-2 записи.

Зависимости

Чтобы включить это свойство, установите PhaseQuantization свойство к 1 (true).

Выход данных. Если вы задаете 'Binary point scaling'объект определяет тип данных с фиксированной точкой с помощью OutputSigned, OutputWL, и OutputFL свойства.

Этот параметр игнорируется, если любой вход имеет тип с плавающей точкой. В этом случае тип выходных данных double.

Это свойство доступно только для чтения.

Подписанный или неподписанный формат выходных данных. Все выходы подписаны форматом.

Выход размера слова, в битах, задаётся как целое число. Это значение должно включать бит знака.

Выход дроби, в битах, задается как скаляр целое число.

Использование

Описание

Объект возвращает значение формы волны, Y, как синусоидальное значение, косинусоидальное значение, комплексная экпонента значение или [Sine,Cosine] пара значений, в зависимости от свойства Waveform.

[Y,ValidOut] = hdlnco(Inc,ValidIn) возвращает синусоидальный сигнал, Y, сгенерированный объектом HDLNCO System, с использованием шага фазы, Inc. Когда ValidIn является true, Inc добавляется к аккумулятору. The Inc аргумент необязателен. Кроме того, можно задать шаг фазы как свойство.

пример

[Y,ValidOut] = hdlnco (ValidIn) возвращает форму волны, Y, использование параметров формы волны из свойств, а не входных параметров.

Чтобы использовать этот синтаксис, задайте свойства PhaseIncrementSource, PhaseOffsetSource и DitherSource равными 'Property'. Эти свойства независимы друг от друга. Для примера:

hdlnco = dsp.HDLNCO('PhaseIncrementSource','Property', ...
       'PhaseIncrement',phIncr,...
       'PhaseOffset',phOffset,...
       'NumDitherBits',4)

пример

[Y,ValidOut] = hdlnco(Inc,Offset,Dither,ValidIn) возвращает форму волны, Y, с шагом фазы, Inc, смещение фазы, Offset, и dither, Dither.

Этот синтаксис применяется, когда вы задаете свойства PhaseIncrementSource, PhaseOffsetSource и DitherSource равными 'Input port'. Эти свойства независимы друг от друга. Можно смешивать и совпадать с активацией этих аргументов. PhaseIncrementSource является 'Input port' по умолчанию. Для примера:

hdlnco = dsp.HDLNCO('PhaseOffsetSource','Input port',...
                    'DitherSource','Input port')
for k = 1:1/Ts
   y(k) = hdlnco(phIncr,phOffset,ditherBits,true);
end

[Y,Phase,ValidOut] = hdlnco(___) возвращает форму волны, Y, и текущая фаза, Phase. Фаза является выходом квантованного аккумулятора.

Чтобы использовать этот синтаксис, задайте значение свойства PhasePort true. Этот синтаксис может включать любой из аргументов из других синтаксисов.

[___] = hdlnco(___,ResetAccum,ValidIn) сбрасывает значение аккумулятора, но не сбрасывает выходные выборки в трубопроводе. Если ValidIn является trueзатем объект продолжает генерировать выход сигнал, начиная с значения аккумулятора сброса.

Чтобы использовать этот синтаксис, задайте значение свойства ResetAction 1 (true). Этот синтаксис может включать любой из аргументов из других синтаксисов.

Входные параметры

расширить все

Шаг фазы, заданный как скалярное целое число.

double и single типы данных поддерживаются для симуляции, но не для генерации HDL-кода.

Зависимости

Чтобы включить этот аргумент, задайте значение свойства PhaseIncrementSource 'Input port'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixdt([],N,0)

Управляющий сигнал, который включает операцию NCO, задается как logical скаляр. Когда ValidIn является trueобъект увеличивает шаг фазы и захватывает любые входные значения. Когда ValidIn является falseобъект содержит аккумулятор фазы и игнорирует любые входные значения.

Когда SamplesPerFrame значение свойства больше 1, этот сигнал позволяет обрабатывать SamplesPerFrame выборки.

Типы данных: logical

Смещение фазы, заданное как скалярное целое число.

double и single типы данных поддерживаются для симуляции, но не для генерации HDL-кода.

Зависимости

Чтобы включить этот аргумент, задайте значение свойства PhaseOffsetSource 'Input port'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixdt([],N,0)

Dither, заданный как целое число или как вектор-столбец целых чисел. Длина вектора должна равняться SamplesPerFrame значение свойства.

double и single типы данных поддерживаются для симуляции, но не для генерации HDL-кода.

Зависимости

Чтобы включить этот аргумент, задайте значение свойства DitherSource 'Input port'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixdt([],N,0)

Управляющий сигнал, который сбрасывает аккумулятор, задается как logical скаляр. Когда этот сигнал trueобъект устанавливает начальное значение аккумулятора. Этот сигнал не сбрасывает выходные выборки в трубопроводе.

Зависимости

Чтобы включить этот аргумент, задайте значение свойства ResetAction 1 (true).

Типы данных: logical

Выходные аргументы

расширить все

Сгенерированная форма волны, возвращенная в виде скаляра или вектора длины SamplesPerFrame. Этот аргумент может быть sin или cos значение, exp значение, представляющее cosine + j*sine, или пара аргументов в форме [Sine,Cosine].

Если любой вход имеет тип с плавающей точкой, объект возвращает значения с плавающей точкой для формы волны и Phase аргументы, в противном случае объект возвращает значения, используя тип, заданный OutputDataType свойство.

double и single типы данных поддерживаются для симуляции, но не для генерации HDL-кода.

Зависимости

По умолчанию выход сигнал является синусоидой. Формат выход формы волны зависит от свойства Waveform.

Управляющий сигнал, который указывает на валидность из выхода данных, заданный как logical скаляр. Когда validOut является true, значения Y и Phase действительны. Когда validOut является false, значения Y и Phase недопустимы.

Когда SamplesPerFrame значение свойства больше 1, этот сигнал указывает на валидность всех элементов в векторах выхода.

Типы данных: logical

Текущая фаза NCO, возвращенная как скаляр или как вектор длины SamplesPerFrame. Фаза является выходом квантованного аккумулятора с приложенными смещением и шагом. Если квантование отключено, этот порт возвращает выход аккумулятора со смещением и шагом.

Значения имеют тип fixdt(1,N,0), где N является NumQuantizerAccumulatorBits значение свойства. Если квантование отключено, то N является AccumulatorWL значение свойства.

Если любой входной параметр является типом с плавающей точкой, объект возвращает Phase аргумент как значение с плавающей точкой. Типы с плавающей точкой поддерживаются для симуляции, но не для генерации HDL-кода.

Зависимости

Чтобы включить этот аргумент, задайте значение свойства PhasePort 1 (true).

Типы данных: single | double | fixdt(1,N,0)

Функции объекта

Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем obj, используйте следующий синтаксис:

release(obj)

расширить все

stepЗапуск алгоритма системного объекта
releaseОтпустите ресурсы и допустите изменения в значениях свойств системного объекта и входных характеристиках
resetСброс внутренних состояний Системного объекта

Примеры

свернуть все

В этом примере показано, как спроектировать HDL-совместимый источник NCO.

Написание функции, которая создает и вызывает Системную object™, основанную на требованиях к форме волны. Вы можете сгенерировать HDL из этой функции.

Примечание.Синтаксис объекта выполняется только в R2016b или более поздней версии. Если вы используете более ранний релиз, замените каждый вызов объекта на эквивалентный step синтаксис. Для примера замените myObject(x) с step(myObject,x).

function yOut = HDLNCO510(validIn)
%HDLNCO510 
% Generates one sample of NCO waveform using the dsp.HDLNCO System object(TM)
% validIn is a logical scalar value
% phase increment, phase offset, and dither are fixed.
% You can generate HDL code from this function.

  persistent nco510;
  
  if isempty(nco510)
  % Since calculation of the object parameters results in constant values, this
  % code is not included in the generated HDL. The generated HDL code for
  % the NCO object is initialized with the constant property values. 

   F0 = 510;     % Target output frequency in Hz
   dphi = pi/2;  % Target phase offset
   df = 0.05;    % Frequency resolution in Hz
   minSFDR = 96; % Spurious free dynamic range(SFDR) in dB 
   Ts = 1/4000;  % Sample period in seconds

   % Calculate the number of accumulator bits required for the frequency
   % resolution and the number of quantized accumulator bits to satisfy the SFDR 
   % requirement. 
   Nacc = ceil(log2(1/(df*Ts)));
   % Actual frequency resolution achieved = 1/(Ts*2^Nacc)
   Nqacc = ceil((minSFDR-12)/6);
   % Calculate the phase increment and offset to achieve the target frequency
   % and offset.
   phIncr = round(F0*Ts*2^Nacc);
   phOffset = 2^Nacc*dphi/(2*pi);
   nco510 = dsp.HDLNCO('PhaseIncrementSource','Property', ...
       'PhaseIncrement',phIncr,...
       'PhaseOffset',phOffset,...
       'NumDitherBits',4, ...
       'NumQuantizerAccumulatorBits',Nqacc,...
       'AccumulatorWL',Nacc);
  end    
  
  yOut = nco510(validIn);
  
end

Вызовите объект, чтобы сгенерировать точки данных в синусоиду. Вход объекта является допустимым управляющим сигналом.

Ts = 1/4000;
y = zeros(1,1/Ts);
for k = 1:1/Ts
   y(k) = HDLNCO510(true);
end

Постройте график среднеквадратичного спектра синусоиды 510 Гц, генерируемых NCO.

sa = dsp.SpectrumAnalyzer('SampleRate',1/Ts);
sa.SpectrumType = 'Power density';
sa.PlotAsTwoSidedSpectrum = false;
sa(y')

Алгоритмы

расширить все

Реализация NCO зависит от того, включите ли вы LUTCompress свойство.

Без сжатия интерполяционной таблицы объект использует ту же интерполяционную таблицу с четвертью синуса, что и NCO блок. Размер LUT равен 2NumQuantizerAccumulatorBits-2× <reservedrangesplaceholder0> биты.

Если вы не включите PhaseQuantization, затем NumQuantizerAccumulatorBits= AccumulatorWL. Примите во внимание влияние на память симулятора и аппаратные ресурсы, когда вы выбираете эти параметры.

Вопросы совместимости

расширить все

Поведение изменено в R2020a

Поведение изменено в R2020a

Ссылки

[1] Cordesses, L., «Direct Digital Synthesis: A Tool for Periodic Wave Generation (Part 1)». Журнал обработки сигналов IEEE. Том 21, Выпуск 4, Июль 2004, стр. 50-54.

См. также

Объекты

Блоки

Введенный в R2013a