dsp. HDLFIRRateConverter

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

Описание

Система dsp.HDLFIRRateConverter object™ сверхдискретизировала, фильтрует и субдискретизирует входные сигналы. Это оптимизировано для генерации HDL-кода и работает с одной выборкой каждого канала за один раз. Объект реализует эффективную многофазную архитектуру, чтобы избежать ненужных арифметических операций и высоких промежуточных частот дискретизации.

Объект сверхдискретизировал целочисленным фактором L, применяет КИХ-фильтр и субдискретизирует целочисленным фактором M. Объект принимает и возвращает аргументы управляющего сигнала для того, чтобы следовать по потоку выборок. Для детали интерфейса управления потоками смотрите Управление потоками.

Передискретизировать и отфильтровать входные данные:

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

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

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Синтаксис

HDLFIRRC = dsp.HDLFIRRateConverter
HDLFIRRC = dsp.HDLFIRRateConverter(L,M,num)
HDLFIRRC = dsp.HDLFIRRateConverter(___,Name,Value)

Описание

HDLFIRRC = dsp.HDLFIRRateConverter возвращает Системный объект, HDLFIRRC, который передискретизирует каждый канал входа. Объект сверхдискретизировал целочисленным фактором L, применяет КИХ-фильтр и субдискретизирует целочисленным фактором M. L/M по умолчанию является 3/2.

пример

HDLFIRRC = dsp.HDLFIRRateConverter(L,M,num) устанавливает свойство InterpolationFactor на L, свойство DecimationFactor к M и свойство Numerator к num.

HDLFIRRC = dsp.HDLFIRRateConverter(___,Name,Value) свойства наборов с помощью одной или нескольких пар "имя-значение". Заключите каждое имя свойства в одинарные кавычки. Например:

HDLFIRRC = dsp.HDLFIRRateConverter(L,M,Num,'ReadyPort',true,'RequestPort',true);

Свойства

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

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

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

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

Сверхдискретизировав фактор, L, заданный как положительное целое число.

Субдискретизируя фактор, M, заданный как положительный целочисленный скаляр.

КИХ-коэффициенты фильтра, заданные как вектор в убывающих степенях z-1.

Можно сгенерировать коэффициенты фильтра при помощи функций проекта фильтра Signal Processing Toolbox™, таких как fir1. Разработайте фильтр lowpass с нормированной частотой среза, не больше, чем min(1/L,1/M). Объект инициализирует внутренние состояния фильтра, чтобы обнулить.

Включите выходной аргумент ready объекта. Когда включено, объект возвращает логическое скалярное значение, ready, когда вы вызываете объект. Когда ready является (TRUE) 1, объект готов к новому входу, выбирают в следующий раз, когда вы вызываете его.

Включите входной параметр request объекта. Когда request является (TRUE) 1, объект возвращает новую выходную выборку на текущем вызове объекта.

Режим Rounding используется для операций фиксированной точки. Это свойство не применяется, когда вход является типом double или single. режим 'Simplest' не поддержан.

Режим переполнения используется для операций фиксированной точки. Это свойство не применяется, когда вход является типом double или single.

Тип данных КИХ фильтрует коэффициенты, заданные как объект numerictype(s,wl,fl) с signedness, word length и свойствами fractional length.

Тип данных выборок выходных данных, заданных как 'Same word length as input', 'Full precision', или как объект numerictype(s,wl,fl) с signedness, word length и свойствами fractional length.

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

Для версий ранее, чем R2016b, используйте функцию step, чтобы запустить алгоритм Системного объекта. Аргументы к step являются объектом, который вы создали, сопровождаемый аргументами, показанными в этом разделе.

Например, y = step(obj,x) и y = obj(x) выполняют эквивалентные операции.

Синтаксис

[dataOut,validOut] = HDLFIRRC(dataIn,validIn)
[dataOut,ready,validOut] = HDLFIRRC(dataIn,validIn)
[dataOut,ready,validOut] = HDLFIRRC(dataIn,validIn,request)

Описание

пример

[dataOut,validOut] = HDLFIRRC(dataIn,validIn) передискретизирует dataIn согласно свойствам InterpolationFactor (L) и DecimationFactor (M). Чтобы избежать пропущенных выборок при использовании этого синтаксиса, примените новые допустимые входные выборки, с набором validIn к true, только каждый ceil(L/M) вызовы объекта. Объект устанавливает validOut на true, когда dataOut является новой допустимой выборкой.

пример

[dataOut,ready,validOut] = HDLFIRRC(dataIn,validIn) передискретизирует входные данные и возвращает ready, чтобы указать, может ли объект принять новую выборку на следующем вызове.

Этот синтаксис применяется, когда вы устанавливаете свойство ReadyPort на true. Например:

HDLFIRRC = dsp.HDLFIRRateConverter(...,'ReadyPort',true);
...
[dataOut,validOut,ready] = rateConverter(dataIn,validIn);

пример

[dataOut,ready,validOut] = HDLFIRRC(dataIn,validIn,request) передискретизирует входные данные, указывает, может ли объект принять новую выборку, и, если request является true, возвращает следующую доступную выборку.

Этот синтаксис применяется, когда вы устанавливаете свойство RequestPort на true. Например:

HDLFIRRC = dsp.HDLFIRRateConverter(...,'RequestPort',true);
...
[dataOut,validOut] = rateConverter(dataIn,validIn,request);

Можно соединить ready вывод нисходящего объекта к входу request восходящего объекта.

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

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

Ввод данных, заданный как скаляр, или как вектор - строка, где каждый элемент представляет независимый канал.

Данные могут быть действительными или комплексными. double и single позволены для симуляции, но не для генерации HDL-кода.

Типы данных: fi | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | single | double
Поддержка комплексного числа: Да

Валидность входных данных, заданных как логический скаляр.

Когда validIn является (TRUE) 1, объект получает значение на dataIn. Можно применяться, допустимые данные выбирают каждый ceil(L/M) вызовы объекта. Можно использовать дополнительный выходной сигнал ready, чтобы указать, когда объект может принять новую выборку.

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

Запросите для новой выходной выборки, заданной как логический скаляр.

Когда request является (TRUE) 1, и новая выборка выходных данных доступна, объект возвращает выборку с набором validOut к (TRUE) 1. Если никакая выборка не доступна, объект возвращает набор validOut в (FALSE) 0. Объект принимает этот аргумент, когда вы устанавливаете свойство RequestPort на true.

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

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

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

Передискретизируемая и отфильтрованная выборка данных, возвращенная как скаляр, или как вектор, в котором каждый элемент представляет независимый канал. double и single позволены для симуляции, но не для генерации HDL-кода.

Типы данных: fi | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | single | double
Поддержка комплексного числа: Да

Валидность выходных данных, возвращенных как логический скаляр.

Когда validOut является (TRUE) 1, вывод данных допустим. Когда validOut является (FALSE) 0, вывод данных не допустим.

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

Индикатор, что объект готов к новой входной выборке, возвратился как логический скаляр.

Объект возвращает ready = 1, (TRUE), чтобы указать, что объект может принять новую выборку входных данных на следующем вызове. Объект возвращает этот дополнительный выходной параметр, когда вы устанавливаете свойство ReadyPort на true.

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

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

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

release(obj)

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

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

Примеры

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

Преобразуйте сигнал от 48 кГц до 32 кГц при помощи Системы dsp.HDLFIRRateConverter object™.

Задайте частоту дискретизации и длину входного сигнала и форму волны косинуса на 2 кГц. Установите validIn = true для каждой выборки.

Fs = 48e3;                  
Ns = 100;                  
t = (0:Ns-1).'/Fs;         
dataIn = cos(2*pi*2e3*t);  
validIn = true(Ns,1);

Предварительно выделите dataOut и сигналы validOut для более быстрой симуляции.

dataOut = zeros(Ns,1);
validOut = false(Ns,1);

Создайте Системный объект. Сконфигурируйте его, чтобы выполнить преобразование уровня фактором 2/3, с помощью фильтра equiripple.

Numerator = firpm(70,[0 0.25 0.32 1],[1 1 0 0]);
firrc = dsp.HDLFIRRateConverter(2,3,Numerator);

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

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

for k = 1:Ns
    [dataOut(k),validOut(k)] = firrc(dataIn(k),validIn(k));
end

Поскольку входная частота дискретизации выше, чем выходная частота дискретизации, не, каждый член dataOut допустим. Используйте validOut, чтобы извлечь допустимые выборки от dataOut.

y = dataOut(validOut);

Просмотрите сигналы ввода и вывода с Logic Analyzer.

la = dsp.LogicAnalyzer('NumInputPorts',4,'SampleTime',1/Fs,'TimeSpan',Ns/Fs);
modifyDisplayChannel(la,1,'Name','dataIn','Format','Analog','Height',8)
modifyDisplayChannel(la,2,'Name','validIn')
modifyDisplayChannel(la,3,'Name','dataOut','Format','Analog','Height',8)
modifyDisplayChannel(la,4,'Name','validOut')
la(dataIn,validIn,dataOut,validOut)

Преобразуйте сигнал от 40 МГц до 100 МГц при помощи Системы dsp.HDLFIRRateConverter object™. Чтобы постараться не превышать объект как, сигнал сверхдискретизирован, управляйте входным уровнем вручную.

Задайте частоту дискретизации и длину входного сигнала и форму волны косинуса фиксированной точки.

Fs = 40e6;                  
Ns = 50;                  
t = (0:Ns-1).'/Fs;         
x = fi(cos(2*pi*1.2e6*t),1,16,14);

Задайте параметры преобразования уровня. Используйте коэффициент интерполяции 5 и фактор десятикратного уменьшения 2. Вычислите, как часто объект может принять новую входную выборку.

L = 5;   
M = 2;   
stepsPerInput = ceil(L/M);
numSteps = stepsPerInput*Ns;

Сгенерируйте dataIn и validIn на основе того, как часто объект может принять новую выборку.

dataIn = zeros(numSteps,1,'like',x);
dataIn(1:stepsPerInput:end) = x;
validIn = false(numSteps,1);
validIn(1:stepsPerInput:end) = true;

Создайте Системный объект. Сконфигурируйте его, чтобы выполнить преобразование уровня с помощью заданных факторов и equiripple КИХ-фильтра.

Numerator = firpm(70,[0 0.15 0.25 1],[1 1 0 0]);         
rateConverter = dsp.HDLFIRRateConverter(L,M,Numerator);

Создайте Logic Analyzer, чтобы получить и просмотреть сигналы ввода и вывода.

la = dsp.LogicAnalyzer('NumInputPorts',4,'SampleTime',1/Fs,'TimeSpan',numSteps/Fs);
modifyDisplayChannel(la,1,'Name','dataIn','Format','Analog','Height',8)
modifyDisplayChannel(la,2,'Name','validIn')
modifyDisplayChannel(la,3,'Name','dataOut','Format','Analog','Height',8)
modifyDisplayChannel(la,4,'Name','validOut')

Вызовите Системный объект, чтобы выполнить преобразование уровня и получить каждую выходную выборку. Вызовите Logic Analyzer, чтобы добавить каждую выборку в отображение формы волны.

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

for k = 1:numSteps
    [dataOut,validOut] = rateConverter(dataIn(k),validIn(k));    
    la(dataIn(k),validIn(k),dataOut,validOut)    
end

Преобразуйте сигнал от 40 МГц до 100 МГц при помощи Системы dsp.HDLFIRRateConverter object™. Используйте дополнительный выходной сигнал ready, чтобы не превышать объект, когда данные сверхдискретизированы. Сигнал ready указывает, что объект может принять новую выборку данных на следующем вызове объекта.

Задайте частоту дискретизации и длину входного сигнала и форму волны косинуса фиксированной точки. Создайте объект SignalSource обеспечить выборки данных по требованию.

Fs = 40e6;                                  
Ns = 50;                                    
t = (0:Ns-1).'/Fs;                          
x = fi(cos(2*pi*1.2e6*t),1,16,14);          
inputSource = dsp.SignalSource(x);

Задайте параметры преобразования уровня. Используйте коэффициент интерполяции 5 и фактор десятикратного уменьшения 2. Решите, что количество вызовов объекта должно было преобразовать выборки Ns.

L = 5;                                      
M = 2;                                      
numSteps = floor(Ns*L/M);

Создайте КИХ-Системный объект конвертера уровня HDL. Сконфигурируйте его, чтобы выполнить преобразование уровня с помощью заданных факторов и equiripple КИХ-фильтра. Включите дополнительный выходной порт ready.

Numerator = firpm(70,[0 0.15 0.25 1],[1 1 0 0]);     
rateConverter = dsp.HDLFIRRateConverter(L,M,Numerator,'ReadyPort',true);

Создайте Logic Analyzer, чтобы получить и просмотреть сигналы ввода и вывода.

la = dsp.LogicAnalyzer('NumInputPorts',5,'SampleTime',1/Fs,'TimeSpan',numSteps/Fs);
modifyDisplayChannel(la,1,'Name','dataIn','Format','Analog','Height',8)
modifyDisplayChannel(la,2,'Name','validIn')
modifyDisplayChannel(la,3,'Name','dataOut','Format','Analog','Height',8)
modifyDisplayChannel(la,4,'Name','validOut')
modifyDisplayChannel(la,5,'Name','ready')

Инициализируйте сигнал ready. Объект всегда готов к входным данным на первом вызове.

ready = true;

Вызовите Системный объект, чтобы выполнить преобразование уровня и получить каждую выходную выборку. Примените новую входную выборку, когда объект указывает, что это готово. В противном случае установите validIn на false.

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

for k = 1:numSteps
    if ready
        dataIn = inputSource();
    end
    validIn = ready;
    [dataOut,validOut,ready] = rateConverter(dataIn,validIn);
    la(dataIn,validIn,dataOut,validOut,ready)
end

Преобразуйте сигнал от 40 МГц до 100 МГц при помощи Системы dsp.HDLFIRRateConverter object™. Используйте дополнительный входной сигнал request, чтобы управлять уровнем выходных данных. Когда объект получает сигнал request, он возвращает новую выборку выходных данных. Этот пример моделирует тактовую частоту 200 МГц путем запроса, чтобы вывод выбрал каждый второй вызов объекта.

Задайте частоту дискретизации и длину входного сигнала и форму волны косинуса фиксированной точки. Создайте объект SignalSource обеспечить выборки данных по требованию.

Fs = 40e6;                                  
Ns = 50;                                    
t = (0:Ns-1).'/Fs;                          
x = fi(cos(2*pi*1.2e6*t),1,16,14);          
inputSource = dsp.SignalSource(x);

Задайте параметры преобразования уровня. Используйте коэффициент интерполяции 5 и фактор десятикратного уменьшения 2. Решите, что количество вызовов объекта должно было преобразовать выборки Ns.

L = 5;                                      
M = 2;                 
numSteps = floor(2*Ns*L/M);

Создайте КИХ-Системный объект конвертера уровня HDL. Сконфигурируйте его, чтобы выполнить преобразование уровня с помощью заданных факторов и equiripple КИХ-фильтра. Включите дополнительные порты ready и request.

Numerator = firpm(70,[0 0.15 0.25 1],[1 1 0 0]);      
rateConverter = dsp.HDLFIRRateConverter(L,M,Numerator,...
                                        'ReadyPort',true,...
                                        'RequestPort',true);

Создайте Logic Analyzer, чтобы получить и просмотреть сигналы ввода и вывода.

la = dsp.LogicAnalyzer('NumInputPorts',6,'SampleTime',1/Fs,'TimeSpan',numSteps/Fs);
modifyDisplayChannel(la,1,'Name','dataIn','Format','Analog','Height',8)
modifyDisplayChannel(la,2,'Name','validIn')
modifyDisplayChannel(la,3,'Name','request')
modifyDisplayChannel(la,4,'Name','dataOut','Format','Analog','Height',8)
modifyDisplayChannel(la,5,'Name','validOut')
modifyDisplayChannel(la,6,'Name','ready')

Сгенерируйте сигнал, который запрашивает, чтобы новый вывод выбрал каждый второй вызов объекта.

request = false(numSteps,1);
request(1:2:end) = true;

Инициализируйте сигнал ready. Объект всегда готов к входным данным на первом вызове.

ready = true;

Вызовите Системный объект, чтобы выполнить преобразование уровня и получить каждую выходную выборку. Примените новую входную выборку, когда объект указывает, что это готово. В противном случае установите validIn на false. Объект возвращает допустимые выходные выборки, когда request установлен в true.

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

for k = 1:numSteps  
    if ready
        dataIn = inputSource();
    end
    validIn = ready;
    [dataOut,validOut,ready] = rateConverter(dataIn,validIn,request(k));
    la(dataIn,validIn,request(k),dataOut,validOut,ready)    
end

Создайте функцию преобразования уровня, предназначенную для генерации HDL-кода и испытательного стенда, чтобы осуществить его. Функция преобразовывает сигнал от 40 МГц до 100 МГц. Чтобы постараться не превышать объект, испытательный стенд вручную управляет входным уровнем.

Задайте частоту дискретизации и длину входного сигнала и форму волны косинуса фиксированной точки.

Fs = 40e6;
Ns = 50;
t = (0:Ns-1).'/Fs;
x = fi(cos(2*pi*1.2e6*t), 1, 16, 14);

Задайте параметры преобразования уровня. Используйте коэффициент интерполяции 5 и фактор десятикратного уменьшения 2. Вычислите, как часто объект может принять новую выборку данных.

L = 5;
M = 2;
stepsPerInput = ceil(L/M);
numSteps = stepsPerInput*Ns;

Сгенерируйте dataIn и validIn на основе того, как часто объект может принять новую выборку.

dataIn = zeros(numSteps,1,'like',x);
dataIn(1:stepsPerInput:end) = x;
validIn = false(numSteps,1);
validIn(1:stepsPerInput:end) = true;

Создайте Logic Analyzer, чтобы получить и просмотреть сигналы ввода и вывода.

la = dsp.LogicAnalyzer('NumInputPorts',4,'SampleTime',1/Fs,'TimeSpan',numSteps/Fs);
modifyDisplayChannel(la,1,'Name','dataIn','Format','Analog','Height',8)
modifyDisplayChannel(la,2,'Name','validIn')
modifyDisplayChannel(la,3,'Name','dataOut','Format','Analog','Height',8)
modifyDisplayChannel(la,4,'Name','validOut')

Запишите функцию, которая создает и вызывает Системный объект.

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

function [dataOut,validOut] = HDLFIRRC5_2(dataIn,validIn)
%HDLFIRRC5_2
% Processes one sample of data using the dsp.HDLFIRRateConverter System
% object. dataIn is a fixed-point scalar value. validIn is a logical scalar value.
% You can generate HDL code from this function.

  persistent firrc5_2;
  if isempty(firrc5_2)  
    Numerator = firpm(70,[0,.15,.25,1],[1,1,0,0]);   
    firrc5_2 = dsp.HDLFIRRateConverter(5,2,Numerator);
  end    
  [dataOut,validOut] = firrc5_2(dataIn,validIn);
end

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

for k = 1:numSteps
    [dataOut,validOut] = HDLFIRRC5_2(dataIn(k),validIn(k));
    la(dataIn(k),validIn(k),dataOut,validOut)
end

Алгоритмы

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

Этот объект реализует алгоритмы, описанные на странице с описанием блока FIR Rate Conversion HDL Optimized.

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

Блоки

Системные объекты

Введенный в R2015b