dsp.HDLNCO

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

Описание

Система NCO HDL object™ генерирует действительный, или объедините синусоидальные сигналы при обеспечении благоприятных для оборудования управляющих сигналов. Генератор с программным управлением (NCO) накапливает шаг фазы и использует квантованный выход аккумулятора как индекс к интерполяционной таблице, которая содержит значения синусоиды. Переносить типов данных аккумулятора и квантизатора фиксированной точки обеспечивает периодичность синусоиды, и квантование уменьшает необходимый размер таблицы для данного разрешения частоты.

Для примера того, как сгенерировать синусоиду с помощью этого Системного объекта, см. Проект Совместимый с HDL Источник NCO. Для получения дополнительной информации о настройке и реализации, обратитесь к разделу Algorithms.

Системный объект NCO HDL обеспечивает эти функции.

  • Дополнительный основанный на системе координат выход.

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

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

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

  • Дополнительный выходной аргумент в пользу текущей фазы NCO.

Сгенерировать действительный или объединить синусоидальные сигналы:

  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.

Сжатие интерполяционной таблицы в виде логического ноля (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), объект сбрасывает аккумулятор к своему начальному значению.

Типы данных

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

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

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

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

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

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

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

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

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

Когда PhaseQuantization свойством является 0, затем AccumulatorWL определяет размер LUT. Для генерации HDL-кода размер LUT должен быть между 2 и 217 записи. Когда вы устанавливаете LUTCompress свойство к 1 TRUE), AccumulatorWL должно быть целое число в области значений [5,21]. Когда вы устанавливаете LUTCompress свойство к 0 ложь), AccumulatorWL должно быть целое число в области значений [3,19]. Для получения дополнительной информации о том, как этот параметр влияет на размер LUT, смотрите раздел Lookup Table Compression.

Когда вы устанавливаете PhaseQuantization свойство к 1, нет никакого предела значению свойства размера слова аккумулятора.

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

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

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

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

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

Когда вы устанавливаете LUTCompress свойство к 1 TRUE), AccumulatorWL должно быть целое число в области значений [5,21]. Когда вы устанавливаете LUTCompress свойство к 0 ложь), AccumulatorWL должно быть целое число в области значений [3,19]. Для получения дополнительной информации о том, как этот параметр влияет на размер LUT, смотрите раздел Lookup Table Compression.

Когда вы устанавливаете QuantizePhase свойство к true, нет никакого предела NumQuantizerAccumulatorBits значение свойства.

Зависимости

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

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

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

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

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

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

Выведите дробную длину в битах в виде скалярного целого числа.

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

Описание

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

[Y,ValidOut] = hdlnco(Inc,ValidIn) возвращает синусоидальный сигнал, Y, сгенерированный Системным объектом HDLNCO, с помощью шага фазы, Inc. Когда ValidIn true, Inc добавляется к аккумулятору. 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 выборки.

Типы данных: логический

Фаза возмещена в виде скалярного целого числа.

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

Зависимости

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

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

Размойтесь в виде целого числа или как вектор-столбец целых чисел. Длина вектора должна равняться 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).

Типы данных: логический

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

развернуть все

Сгенерированная форма волны, возвращенная как скаляр или вектор из длины 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, этот сигнал указывает на валидность всех элементов в выходных векторах.

Типы данных: логический

Текущая фаза 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')

Алгоритмы

развернуть все

Разрешение частоты синусоиды зависит от размера аккумулятора. Учитывая шаг расчета, T s и желаемое выходное разрешение частоты Δf, вычисляют необходимый размер слова аккумулятора, N.

N=ceil(log2(1TsΔf))

Для желаемой выходной частоты F o, вычислите phase increment.

phase increment=round(F0Ts2N)

Квантование выхода аккумулятора фазы позволяет вам уменьшать размер интерполяционной таблицы, не понижая разрешение частоты. Вычислите квантованный размер слова, чтобы достигнуть желаемого свободного от паразитных составляющих динамического диапазона (SFDR).

Q=ceil(SFDR126)

Смещение фазы и dither опционально добавляются на этапе аккумулятора. Для желаемого смещения фазы (в радианах) выходной формы волны, вычислите значение phase offset, которое объект добавляет в аккумуляторе.

phase offset=2Ndesired phase offset2π

Реализация NCO зависит от того, разрешаете ли вы LUTCompress свойство.

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

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

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

Для примера того, как сгенерировать синусоиду с помощью этого Системного объекта, см. Проект Совместимый с HDL Источник NCO.

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

развернуть все

Поведение изменяется в R2020a

Поведение изменяется в R2020a

Ссылки

[1] Cordesses, L., "Прямой цифровой синтез: Инструмент для Периодической Генерации Волны (Часть 1)". Журнал Обработки сигналов IEEE. Объем 21, Выпуск 4, июль 2004, стр 50–54.

Расширенные возможности

Смотрите также

Объекты

Блоки

Введенный в R2013a