dsp.HDLFIRRateConverter

Upsample, фильтр и downsample - оптимизированный для генерации HDL-кода

Описание

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

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

Для повторной выборки и фильтрации входных данных:

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

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

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

Создание

Описание

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 Использование Системных объектов.

Коэффициент увеличения дискретизации, L, задается как положительное целое число.

Коэффициент понижающей дискретизации, M, задается как положительный целочисленный скаляр.

Конечные импульсные характеристики, заданные как вектор в нисходящих степенях z-1.

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

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

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

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

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

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

Тип данных выходов данных, заданный как 'Same word length as inputFull 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 выходной сигнал, чтобы указать, когда объект может принять новую выборку.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем 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;

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

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