Jump to content

    

Recommended Posts

Nabokov

Но это вроде бы не отвечает на мой вопрос. Зачем на приемной стороне устанавливать фильтр raised cosine (т.е. когда в параметрах стоит Normal)?

Вопрос некорректный, откуда зачем появляется, где он на приёмной стороне стоит?

Share this post


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

Вопрос некорректный, откуда зачем появляется, где он на приёмной стороне стоит?

Попробую переформулировать.

В хелпах матлаба есть пример симулинковской модели, где сравниваются эти два фильтра:

690086851_2020-06-0218-18-32.thumb.png.051748bc22b69f45b80e8c05be7f883c.png

В верхней ветке после модулятора стоит sqr-вариант raised cosine фильтра. Для того, чтобы в моменты взятия отсчетов на приемной стороне отсутствовала межсимвольная интерференция, необходимо сигнал пропустить через такой же фильтр.

В нижней же ветке используется просто raised cosine. В моменты взятия отсчетов ИХ фильтра равна нулю => вклада от соседних импульсов нет => интерференции нет => просто выбираем отсчеты в нужные моменты времени с помощью downsample.

Прошу поправить меня, если в чем-то неправ.

Если открыть блок Raised Cosine Receive Filter, то там в параметре Pulse Shape вместо square root варианта можно выбрать просто raised cosine. Вопрос - зачем такая возможность присутствует именно на приемной стороне? Ведь либо фильтровать сигнал вообще не надо (если на передающей стороне использовался raised cosine), либо нужно фильтровать square root cosine фильтром (если на передающей стороне тоже стоял он). В каких ситуациях может возникнуть необходимость ставить raised cosine фильтр на приемной стороне?

Share this post


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

Если открыть блок Raised Cosine Receive Filter, то там в параметре Pulse Shape вместо square root варианта можно выбрать просто raised cosine. Вопрос - зачем такая возможность присутствует именно на приемной стороне?

Так используется же один и тот же блок Simulink, поэтому логично, что в его настройках есть оба типа фильтров.

Share this post


Link to post
Share on other sites

Nabokov

стоит sqr-вариант raised cosine фильтра

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

Вопрос - зачем такая возможность присутствует именно на приемной стороне?

Именно приёмная сторона берётся ниоткуда, если вы поставили на приёме, то вам и объяснять, зачем вы это делаете.

Share this post


Link to post
Share on other sites

Но вообще, в свое время носились у меня мысли сделать передатчик по классическому найквисту: проще фильтр на 2sps, уже полоса можно символьную в маску вписать, меньше пикфактор, а вот в приемнике, для согласования полосы использовался такойже фильтр, но рассчитанный на большее скругление + эквалайзер) но до аппаратной реализации не довел)

Share this post


Link to post
Share on other sites

Появились еще вопросы.

Составил такую модель в симулинке:

1825511049_2020-06-0420-00-47.thumb.png.13425d465dd0bd85ff90777ea338b11f.png

BER совпадает с теоретическим при использовании обоих фильтров (проверял по bertool'у).

1) Смущает, что в блоках raised cosine filter в параметре Linear amplitude filter gain по умолчанию задается функция rcfiltgaincompat(gcbh). Внутри функции рассчитывается значение к-нта усиления таким образом (g - то что идет на выход функции):

switch filtType
  case 'Normal'
    b = rcosdesign(R, filtSpan, N, 'normal');
    g = 1 / max(b);
  case 'Square root'
    b = rcosdesign(R, filtSpan, N, 'sqrt');
    g = 1 / max(b) * ((-1/(pi*N)*(pi*(R-1)-4*R))) * sqrt(N);
end

Если в первом случае, допустим, осуществляется просто нормирование к максимуму ИХ, то что такое ((-1/(pi*N)*(pi*(R-1)-4*R))) * sqrt(N) я понять не могу. Кто-нибудь может подсказать, для чего это?

2) Пытаюсь повторить такой же эксперимент в коде матлаба:

SamplePerSymbol = 4;      
m = 2;              
M = 2^m;            
numBit = 5e6;       

dqpskMod = comm.DQPSKModulator('PhaseRotation',pi/4, ...
                               'BitInput',true, ...
                               'SymbolMapping','Gray');
dqpskDemod = comm.DQPSKDemodulator('PhaseRotation', pi/4, ...
                                   'BitOutput', true, ...
                                   'SymbolMapping', 'Gray');
FilterParams.Shape = 'Normal';
FilterParams.RollOffFactor = 0.2;
FilterParams.FilterSpan = 16;
FilterParams.Gain = 1.93;

txFilt = comm.RaisedCosineTransmitFilter(...             
  'Shape', FilterParams.Shape, ...
  'RolloffFactor', FilterParams.RollOffFactor, ...
  'OutputSamplesPerSymbol', SamplePerSymbol, ...
  'FilterSpanInSymbols', FilterParams.FilterSpan, ...
  'Gain', FilterParams.Gain);
rxFilt = comm.RaisedCosineReceiveFilter(...
  'Shape',FilterParams.Shape, ...
  'RolloffFactor',FilterParams.RollOffFactor, ...
  'InputSamplesPerSymbol',SamplePerSymbol, ...
  'FilterSpanInSymbols', FilterParams.FilterSpan, ...
  'DecimationFactor', SamplePerSymbol, ...
  'Gain', FilterParams.Gain);

if(strcmp(FilterParams.Shape,'Square root'))
    errorRate = comm.ErrorRate('ReceiveDelay',2*FilterParams.FilterSpan);
elseif(strcmp(FilterParams.Shape,'Normal'))
    errorRate = comm.ErrorRate('ReceiveDelay',FilterParams.FilterSpan);
end
EbN0 = 10;
BER = 0;
for i = 1:length(EbN0)
    %% Модуляция и фильтрация
    bits = randi([0 1],1,numBit);
    modSymbols = dqpskMod.step(bits.');
    signal = txFilt(modSymbols);
    %% Шум
    signalNoise = awgn(signal,EbN0(i) - 10*log10(SamplePerSymbol) + 10*log10(log2(M)),'measured').';
    %% Демодуляция
    if(strcmp(FilterParams.Shape,'Square root'))
        signalDownsampled = rxFilt(signalNoise.');
    elseif(strcmp(FilterParams.Shape,'Normal'))
        signalDownsampled = downsample(signalNoise,SamplePerSymbol).';
    end 
    demodBits = dqpskDemod(signalDownsampled).';
    errors = errorRate(bits',demodBits');
    BER = errors(1)
end

Для 'Square root' BER совпадает с тем, что получилось в симулинке. И результат не зависит от параметра 'Gain'

В случае когда использую форму ИХ фильтра 'Normal', параметр 'Gain' выбираю такой, какой возвращается функцией rcfiltgaincompat(gcbh) из симулинка (для фильтра с параметром 'Normal', само собой), при этом BER ухудшается на два порядка.

Сразу хочу сказать, что при EbNo = inf ошибок нет, все работает правильно.

Предполагаю, что тут проблема в этом параметре 'Gain'. Не могу понять, как правильно его задавать.

Буду рад помощи.

 

Share this post


Link to post
Share on other sites

Nabokov

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

Для приподнятого косинуса лучше использовать блок Digital Filter Design, там больше важных вещей задаётся и видно.

Пытаюсь повторить такой же эксперимент в коде матлаба

Лишняя повторная работа ИМХО, симулинк облегчает понимание, код матлабовский приводит к самозапутыванию, когда понимания нет.

 

Share this post


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

Лишняя повторная работа ИМХО, симулинк облегчает понимание, код матлабовский приводит к самозапутыванию, когда понимания нет.

Абсолютно с вами согласен. Просто я симулинком не пользовался никогда с целью моделирования. Все писал кодом. Сейчас решил попробовать, но столкнулся с тем, что результаты разные, что неприятно.

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

Для приподнятого косинуса лучше использовать блок Digital Filter Design, там больше важных вещей задаётся и видно.

То есть, в этом блоке задавать коэффициенты, например, и вместо блока Raised Cosine Transmiter\Receiver filter использовать?

Share this post


Link to post
Share on other sites

Nabokov

То есть, в этом блоке задавать коэффициенты, например, и вместо блока Raised Cosine Transmiter\Receiver filter использовать?

Да. Мы же фильтр с характеристикой корень из приподнятого косинуса с какой-то целью используем. С какой? Ведь можно взять просто прямоугольные импульсы, согласованный фильтр для них тоже не даёт МСИ.

В симулинке лучше придерживаться sample based принципа моделирования для данной темы.

Share this post


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

Мы же фильтр с характеристикой корень из приподнятого косинуса с какой-то целью используем. С какой? Ведь можно взять просто прямоугольные импульсы, согласованный фильтр для них тоже не даёт МСИ.

я пытаюсь промоделировать работу одной системы связи. Там используется именно rasied cosine (НЕ square root).

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

В симулинке лучше придерживаться sample based принципа моделирования для данной темы.

А не могли бы вы пояснить, почему? Чтобы проще было отслеживать изменения сигналов во времени, например?

Share this post


Link to post
Share on other sites

Nabokov

я пытаюсь промоделировать работу одной системы связи. Там используется именно rasied cosine (НЕ square root).

Тогда возможно вся эта специфика приподнятого косинуса не имеет значения, и он используется как подходящий ФНЧ.

Чтобы проще было отслеживать изменения сигналов во времени, например?

Да, и всякие временные синхронизации естественнее воспринимаются при моделировании отсчёт за отсчётом.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.