dsp.HDLFIRRateConverter

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

Описание

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

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

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

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

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

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

Создание

Описание

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 1 (TRUE), объект готов к новому входу, производят в следующий раз, когда вы вызываете его.

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

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

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

Тип данных КИХ фильтрует коэффициенты, заданные как 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 свойства.

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

Описание

пример

[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 1 (TRUE), объект получает значение на dataIn. Можно применяться, допустимые данные производят каждый ceil(L/M) вызовы объекта. Можно использовать дополнительный ready выходной сигнал, чтобы указать, когда объект может принять новую выборку.

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

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

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

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

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

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

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

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

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

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

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

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

Объект возвращает 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 isvalid. Используйте 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