Перейти к содержанию
    

Дробный интерполятор в Matlab

Добрый день.

Вопрос к знатокам MATLAB. Как в MATLAB построить результирующую АЧХ дробного интерполятора, состоящего из нескольких каскадов?

FVTool как я понимаю такую опцию не поддерживает. Может быть есть какие-то альтернативные варианты или инструменты применительно

к MATLAB?

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто сверните между собой ИХ всех каскадов, а результат в freqz.

Если каскады на разных тактовых это нужно учитывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, _sda сказал:

Просто сверните меду собой ИХ всех каскадов, а результат в freqz.

Если каскады на разных тактовых это нужно учитывать.

А как нужно учитывать разные тактовые при свертке ИХ-каскадов?

В FVTool я делал так f = fvtool(hRRC, hFIR2, hFIR3, FC, 'Fs',[Fs_RRC, Fs, Fs2, Fs2]).

Если бы Вы смогли привести пример или ссылку на пример, был бы Вам очень признателен.

Изменено пользователем Pavel Proskura

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я скриптом считал дециматор.

h_maf100_1100=upsample(h100,4);% суммарная ИХ всего фильтра для тактовой 1100 MHz
w100maf = 20*log10(abs(freqz(h_maf100_1100,1,N,'whole')));

h100 - ИХ секции на частоте Fs/4

h_maf100_1100 - ИХ этого фильтра на частоте Fs.

w100maf - АЧХ каскада для частоты Fs

Все ИХ нужно пересчитать на максимальную частоту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал использовать freqz.

Все равно ругается: Error using mfilt.cascade/validateratechangefactors (line 64)
Analysis of multistage-multirate filters in which interpolators follow fractional
rate converters or decimators is not supported.:beee:

36 минут назад, _sda сказал:

Все ИХ нужно пересчитать на максимальную частоту.

Как это правильно сделать в MATLAB?

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

1)Построить импульсные х-ки каждого каскада для своей частоты дискретизации.

2)Пересчитать ИХ для самой высокой частоты дискретизации (последний каскад интерполятора).

3)Свернуть полученные ИХ между собой (получить результирующую ИХ), для конечной частоты дискретизации.

4) воспользоваться функцией freqz.

Мне не понятно как в MATLAB сделать пункт 2.

Изменено пользователем Pavel Proskura

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то я совсем запутался. 

Допустим я воспользовался функцией resample для пересчета ИХ какого-либо из каскадов (не последнего).

Строю АЧХ. Но АЧХ я получаю в масштабе нормированном на pi rad/sample. Т. о. я не смогу увидеть АЧХ каждого отдельно взятого каскада, и сравнить их

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

а именно как фильтры нормированные каждый на свою частоту дискретизации, но при этом отрисованные в масштабе Fs/2, где Fs - частота дискретизации

последнего каскада. Пример картинки как нужно приведен ниже. Не ужели в matlab нет готовой функции построения АЧХ дробного интерполятора/дециматора,

в виде нескольких каскадов КИХ-фильтров?

untitled.bmp

Изменено пользователем Pavel Proskura

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Pavel Proskura

Не ужели в matlab нет готовой функции

Не нужны никакие функции, это ж тривиально, то что происходит после апсемпла ИХ, просто нулевые коэффициенты добавляются между исходными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, petrov сказал:

Pavel Proskura

Не ужели в matlab нет готовой функции

Не нужны никакие функции, это ж тривиально, то что происходит после апсемпла ИХ, просто нулевые коэффициенты добавляются между исходными.

Дык, это то понятно. Вопрос в другом, как построить эти АЧХ по каскадно и результирующую, на одном графике. Но при этом, чтобы АЧХ отдельных фильтров

были нормированы каждый на свою частоту дискретизации? См. картинку которую я привел. Там ресемплер трехкаскадный, но целочисленный. Не догоняю я,

как тоже самое отрисовать для дробных значений.:dash2: Может есть примеры скрипта именно для отрисовки?

Изменено пользователем Pavel Proskura

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если понятно, то и проблем быть не должно с построеним АЧХ фильтров с нулями между коэффициентами, их свёрткой и АЧХ результирующего фильтра.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, petrov сказал:

Если понятно, то и проблем быть не должно с построеним АЧХ фильтров с нулями между коэффициентами, их свёрткой и АЧХ результирующего фильтра.

Хорошо. Если это так тривиально, а скорее всего так оно и есть, и я действительно что то затупил, то у Вас на построение графика много времени уйти не должно мин.3-5.

Постройте пожалуйста график АЧХ для двух каскадного интерполятора скажем со следующими коэфф.  интерполяции первый 7/5 второй 4. На графике должны быть АЧХ каскадов и 

результирующая АЧХ. Полоса пропускания и неравномерность могут быть любыми - не суть. Буду очень признателен если поделитесь скриптом. 

Заранее спасибо.

Изменено пользователем Pavel Proskura

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

%% Overall FREQ RESPONSE

filtCasc = dsp.FilterCascade(HB_1,HB_2,HB_3,FIR);

f = fvtool(HB_1, HB_2, HB_3, FIR, filtCasc, ... 
    'ShowReference','off', ...
    'NumberofPoints', 8192*128, ...
    'Fs', [1e9 0.5e9 0.25e9 0.125e9 1e9]);


f.NormalizeMagnitudeto1 = 'on';
legend(f,'HB1','HB2','HB3','FIR', ...
    'Overall Response');
filterspec = 'Transition width and stopband attenuation';

%% HB1
Fs = 4e9;

TW = 400e6;
HB_1 =dsp.FIRHalfbandDecimator('Specification',filterspec, ...
                                              'StopbandAttenuation',80, ...
                                              'TransitionWidth',TW, ...
                                              'SampleRate',Fs);

HB_1_Num = HB_1.coeffs.Numerator;

интерполировать ИХ всех каскадов до исходной Fs. свернуть все и freqz

Изменено пользователем dcs

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, dcs сказал:

%% Overall FREQ RESPONSE

Спасибо за ответ. Но увы данная конструкция будет работать только с целочисленными коэфф. преобразования.

16 минут назад, dcs сказал:

'Fs', [1e9 0.5e9 0.25e9 0.125e9 1e9]);

Т.е. 2 4 8.

Я спрашивал про дробные значения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Pavel Proskura сказал:

Я спрашивал про дробные значения.

Что то я никак не могу вас понять. В чём ваша проблема? 

Какая разница целочисленные или дробные значения коэффициентов? Физика процессов от этого не меняется.

Ну поставьте вместо моего upsample свой resample  и получите своё семейство АЧХ приведенное на максимальную Fs.

 

2019-09-28_091312.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

При этом отрисовать АЧХ мне требовалось как на картинке которую приводил я. Вместо этого мне второй день заявляют что проблемы никакой нет. Только вот 

АЧХ в том виде в котором я просил, так никто и не отрисовал. dcs привел скрипт аналогичный моему. Вот попробуйте поставить туда не кратные значения

преобразования частоты дискретизации и запустить fvtools или freqz. А после скажите, есть проблема или ее нет. А также есть разница с точки зрения

алгоритма matlab между целочисленными и дробными коэффициентами. Извините но график который Вы привели меня не устраивает.

Даже ошибку привел которая вылетает  Error using mfilt.cascade/validateratechangefactors (line 64)
Analysis of multistage-multirate filters in which interpolators follow fractional
rate converters or decimators is not supported

А теперь внимание второй вопрос, если разницы между дробными и целыми коэфф. никакой нет, то какого хрена для дробных значений matlab АЧХ отрисовать не может?

Вот и мне этот момент не понятен???

Изменено пользователем Pavel Proskura

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но вы же не слушаете советы мои и dcs. Функции freqz глубоко до лампочки как была получена подсовываемая ей ИХ (с целыми или дробными коэффициентами) поэтому она ругаться на дробный ресемплер просто не умеет. Ваша ошибка из другой оперы.

Вам указали в каком направлении двигаться, а за вас писать скрипты никто не будет. Можно только кинуть что нибудь похожее готовое. У меня,например, дома и матлаба нет, а на работе три проекта в параллель ведутся, много ли свободного времени?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...