Jump to content

    

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

Добрый день.

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

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

к MATLAB?

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
12 минут назад, _sda сказал:

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

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

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

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

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

Edited by Pavel Proskura

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Попробовал использовать 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.

Edited by Pavel Proskura

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

untitled.bmp

Edited by Pavel Proskura

Share this post


Link to post
Share on other sites

Pavel Proskura

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

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

Share this post


Link to post
Share on other sites
8 минут назад, petrov сказал:

Pavel Proskura

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

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

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

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

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

Edited by Pavel Proskura

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
8 часов назад, petrov сказал:

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

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

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

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

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

Edited by Pavel Proskura

Share this post


Link to post
Share on other sites
%% 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

Edited by dcs

Share this post


Link to post
Share on other sites
15 минут назад, dcs сказал:

%% Overall FREQ RESPONSE

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

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

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

Т.е. 2 4 8.

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

Share this post


Link to post
Share on other sites
9 часов назад, Pavel Proskura сказал:

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

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

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

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

 

2019-09-28_091312.png

Share this post


Link to post
Share on other sites

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

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

АЧХ в том виде в котором я просил, так никто и не отрисовал. 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 АЧХ отрисовать не может?

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

Edited by Pavel Proskura

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this