alex_os
Oct 29 2013, 15:53
Цитата(Виктор39 @ Oct 29 2013, 15:48)

я никак не могу найти алгоритм, который мог бы работать с типом сигнала, где биты передаются с помощью ортогональных последовательностей Уолша(MIL-STD-188-141B, ст.284, BW0, BW1, BW3, BW4). подскажите, пожалуйста, какой алгоритм нужно использовать и/или где об этом можно почитать ?!
Нужно гуглить что-то вроде "Maximum likelihood sequence estimation"
Виктор39
Oct 30 2013, 06:33
Цитата(alex_os @ Oct 3 2013, 09:40)

Та разновидность сигнала, где Уолшем передаются биты, в эквалайзере не нуждается, там нечто-то вроде
Rake receiver нужно.
Цитата(alex_os @ Oct 29 2013, 19:53)

Нужно гуглить что-то вроде "Maximum likelihood sequence estimation"
эти два сообщения как-то связаны между собой?
alex_os
Oct 30 2013, 08:00
Цитата(Виктор39 @ Oct 30 2013, 10:33)

эти два сообщения как-то связаны между собой?
C некоторой натяжкой можно сказать что эти оба метода позволяют найти последовательность модулированных символов, которая будучи свернутой с измеренной ИХ даст максимальную корреляцию с принятой последовательностью.
Т.е задача так ставиться - есть принятые отсчеты
y, есть символы которые переносят информацию
x = [x1; x2;.....xn]. Есть измеренная ИХ
h, для простоты предполагаем что она не изменяется во времени. Требуется найти
x. Максимально правдоподобная оценка x будет такая, которая минимизирует евклидово расстояние J = sum( abs( y - conv( x, h ) .^ 2 ) . Т.е. берете все возможные последовательности
x и ищете такую , для которого J минимально. Классическое решение
The Viterbi Algorithm FORNEY .
Теперь ключевой момент. Сложность алгоритма Витерби (т.е. число состояний канала ) будет M^(L-1). M - индекс модуляции символов, L длина h в
символах. Если символом считать одну из последовательностей Уолша, которыми переносится информация, то L получается не велика ( что-то около 1). Таким образом данный подход будет иметь вполне приемлемую сложность.
Виктор39
Oct 30 2013, 11:38
Цитата(alex_os @ Oct 30 2013, 12:00)

C некоторой натяжкой можно сказать что эти оба метода позволяют найти последовательность модулированных символов, которая будучи свернутой с измеренной ИХ даст максимальную корреляцию с принятой последовательностью.
Т.е задача так ставиться - есть принятые отсчеты
y, есть символы которые переносят информацию
x = [x1; x2;.....xn]. Есть измеренная ИХ
h, для простоты предполагаем что она не изменяется во времени. Требуется найти
x. Максимально правдоподобная оценка x будет такая, которая минимизирует евклидово расстояние J = sum( abs( y - conv( x, h ) .^ 2 ) . Т.е. берете все возможные последовательности
x и ищете такую , для которого J минимально. Классическое решение
The Viterbi Algorithm FORNEY .
Теперь ключевой момент. Сложность алгоритма Витерби (т.е. число состояний канала ) будет M^(L-1). M - индекс модуляции символов, L длина h в
символах. Если символом считать одну из последовательностей Уолша, которыми переносится информация, то L получается не велика ( что-то около 1). Таким образом данный подход будет иметь вполне приемлемую сложность.
спасибо большое.
тогда алгоритм может выглядеть следующим образом??? :
1) по преамбуле вычисляется ИХ
h с учетом принимаемых 2 отсчетов на символ(т.е. две ИХ для четных и нечетных отсчетов);
2) с учетом длины последовательностей Уолша равной 16 символов, очередных 32 принятых отсчета каким-то образом перемножаются в матричной форме с ИХ таким образом, чтобы получился вектор из 16 символьных значений
R(скорее всего мне здесь нужно использовать не ИХ
h, а вектор обратный ИХ
h. не понимаю, как это сделать?!);
3) методом наименьшего правдоподобия для каждой из возможных последовательностей Уолша
W вычисляем евклидово расстояние J = sum( abs( R - conv( W, h ) .^ 2 ). по наименьшему расстоянию J принимаем решение о переданной последовательности
T =
W (по сути это и есть урезанный декодер Витерби?);
4) основываясь на этих 16-ти решениях
T, а также на решениях принятых на предыдущей итерации и импульсной характеристике, 16 принимаемых значений могут быть предсказаны и 16 ошибок между предсказанными и полученными значениями могут быть рассчитаны.
5) эти ошибки затем коррелируют(умножаются и усредняются) с 16-ти принятыми решениями
T и с несколькими решениями принятыми на предыдущей итерации(количество определяется длинной ИХ) с соответствующими значениями импульсной характеристики.
6) ИХ обновляется с учетом этих рассчитаных ошибок
7) пункты 2-6 повторяются
Виктор39
Oct 31 2013, 08:34
не знаю или правильно составил я алгоритм, но в любом случае, по измеренной ИХ мне нужно рассчитать вектор значений обратный ИХ,(т.е. коэффициенты прямого фильтра, или трансверсального фильтра, или коррелятора). скажите, что я не правильно делаю? набросал несколько строк кода. по идее выходной сигнал sigOut должен равняться входному сигналу sigIn с учетом задержки. но что-то не получается.
CODE
function test_Estim_LSE
clear;
sigIn = [2, 3, 4, 5, 6, 7, 8, 2, 3, 4, 5, 6, 7, 8, 2, 3, 4, 5, 6, 7, 8, 2, 3, 4, 5, 6, 7, 8, 2, 3, 4, 5, 6, 7, 8];
h = [ 0, 7 , 0, 0, 0, 7, 0, 0, 0]; % ИХ канала
sigFromChannel = filter(h, 1, sigIn);
%% расчет обратных значений ИХ
Lf = 15; % количество коэффициентом
delay = 1;
H = convmtx(h, Lf-length(h)+1);
target = zeros(size(H,1), 1);
target(delay) = 1;
weights = pinv(H' * H) * (H' * target) ;
% Hf = H*f;
%%
sigOut = filter(weights, 1, sigFromChannel);
return;
QUOTE (Виктор39 @ Oct 31 2013, 12:34)

не знаю или правильно составил я алгоритм, но в любом случае, по измеренной ИХ мне нужно рассчитать вектор значений обратный ИХ,(т.е. коэффициенты прямого фильтра, или трансверсального фильтра, или коррелятора). скажите, что я не правильно делаю? набросал несколько строк кода. по идее выходной сигнал sigOut должен равняться входному сигналу sigIn с учетом задержки. но что-то не получается.
CODE
function test_Estim_LSE
clear;
sigIn = [2, 3, 4, 5, 6, 7, 8, 2, 3, 4, 5, 6, 7, 8, 2, 3, 4, 5, 6, 7, 8, 2, 3, 4, 5, 6, 7, 8, 2, 3, 4, 5, 6, 7, 8];
h = [ 0, 7 , 0, 0, 0, 7, 0, 0, 0]; % ИХ канала
sigFromChannel = filter(h, 1, sigIn);
%% расчет обратных значений ИХ
Lf = 15; % количество коэффициентом
delay = 1;
H = convmtx(h, Lf-length(h)+1);
target = zeros(size(H,1), 1);
target(delay) = 1;
weights = pinv(H' * H) * (H' * target) ;
% Hf = H*f;
%%
sigOut = filter(weights, 1, sigFromChannel);
return;
Так обратного ИХ может и не быть - он окажется БИХ как раз вашем в случае, когда отсутствует доминирующий луч или коэффициент. Он и так всегда только приблизительный ИХ, а в этом случае даже приблизительно может не получиться
alex_os
Nov 1 2013, 11:32
Цитата(Виктор39 @ Oct 31 2013, 12:34)

не знаю или правильно составил я алгоритм, но в любом случае, по измеренной ИХ мне нужно рассчитать вектор значений обратный ИХ,(т.е.
Да не должно быть ни каких "обратных ИХ". Пусть s0, s2 ... sn будут символы Уолша длиной 16. Пусть память канала (длина h ) тоже будет 16. Допустим в i-тый момент времени мы знаем состояние канала - s0, т.е знаем какой конкретно символ Уолша передавался. На выходе канала наблюдаем величину y0 (скаляр), допустим сл. символ будет s1, т.е. при смене состояния канала s0 -> s1, будет наблюдаться последовательность
Y = [y1, y2.... y16];
Код
y0 = s0.' * h;
y1 = [ s1(1); s0(1 : end-1)].' * h;
y2 = [ s1(1:2); s0(1 : end-2)].' * h;
y3 = [ s1(1:3); s0(1 : end-3)].' * h;
....
y16 = [ s1].' * h;
Алгоритм следующий: для текущего состояния рассчитываем все возможные последовательности
Y1, Y2 ... Yn. Находим последовательность которая имеет наибольшую корреляцию c принятыми отсчетами, скажем наилучший результат дает Y2, устанавливаем текущее состояние в s2 и все повторяется.
Цитата(alex_os @ Nov 1 2013, 15:32)

Да не должно быть ни каких "обратных ИХ". Пусть s0, s2 ... sn будут символы Уолша длиной 16. Пусть память канала (длина h ) тоже будет 16. Допустим в i-тый момент времени мы знаем состояние канала - s0, т.е знаем какой конкретно символ Уолша передавался. На выходе канала наблюдаем величину y0 (скаляр), допустим сл. символ будет s1, т.е. при смене состояния канала s0 -> s1, будет наблюдаться последовательность
Y = [y1, y2.... y16];
Код
y0 = s0.' * h;
y1 = [ s1(1); s0(1 : end-1)].' * h;
y2 = [ s1(1:2); s0(1 : end-2)].' * h;
y3 = [ s1(1:3); s0(1 : end-3)].' * h;
....
y16 = [ s1].' * h;
Алгоритм следующий: для текущего состояния рассчитываем все возможные последовательности
Y1, Y2 ... Yn. Находим последовательность которая имеет наибольшую корреляцию c принятыми отсчетами, скажем наилучший результат дает Y2, устанавливаем текущее состояние в s2 и все повторяется.
По одной последовательности на пороге С/Ш такой алгоритм косячить будет. Надо корректировать с некоторым соотношением между старыми и новыми коэффициентами. Хотя-бы полусумма между старыми и новыми значениями.
alex_os
Nov 5 2013, 06:13
Цитата(Corner @ Nov 2 2013, 22:12)

По одной последовательности на пороге С/Ш такой алгоритм косячить будет. Надо корректировать с некоторым соотношением между старыми и новыми коэффициентами. Хотя-бы полусумма между старыми и новыми значениями.
Не понял, чего корректировать и какие коэффициенты имеются ввиду?
Виктор39
Nov 19 2013, 12:32
здравствуйте. не могу решить следующую задачку:
преамбула состоит из 15 следующих значений: 0,1,3,0,1,3,1,2,0,D1,D2,C1,C2,C3,0
каждому значению преамбулы соответсnвует скремблированная ортогональная последовательность УОлша длинной в 32 канальных символа. данная преамбула повторяется несколько раз подряд. первая часть преамбулы мне известна (0,1,3,0,1,3,1,2,0), она состоит из 288 канальных символов. вторая часть (D1,D2,C1,C2,C3) мне предварительно не известна, в ней передается информация о типе передаваемых данных. так вот, по первой части преамбулы(0,1,3,0,1,3,1,2,0), если я правильно понимаю, мне нужно обнаружить начало сигнала, рассчитать частотную ошибку (+-75Гц), а также измерить импульсную характеристику канала... никак не могу придумать как я могу использовать преамбулу максимально выгодно.
например, я пробую по первым 6 значениям преамбулы(0,1,3,0,1,3), т.е. 192-ум канальным символам, обнаружить сигнал и рассчитать его частотную ошибку следующим образом: непрерывно сворачиваю 96 канальных символа(соответствующих трем значениям преамбулы 0,1,3) с предыдущими 96-ью символами. и когда последовательности будут совпадать, пик будет максимальный. далее рассчитывая разность фаз между соответcтвующими символами сворачиваемых последовательностей, с учетом задержки, не трудно рассчитать частоту. но есть две проблемки. первая, при таком методе не учитываются ортогональные свойства преамбулы, и пик получается очень размытый. в плохих каналах, при различных замираниях, пик может быть смещен на несколько символов в одну из сторон. но все бы хорошо, ведь я могу с помощью измеренной импульсной характеристики найти потом точку синхронизации. но проблема в том, что таким методом максимальная частотная ошибка, которую я могу измерить равна +-25Гц, а мне нужно +-75Гц. с помощью fft(свернуть часть принятой преамбулы с известными передаваемыми данными, выделив таким образом частотную ошибку, затем сделать fft ) я не могу рассчитать частотную ошибку, так как точка синхронизации известна с некой погрешностью(в несколько символов).
пробовал сделать банк фильтров, с коррелирующей последовательностью равной 48 символов. проблема в том, что для этого я не могу брать символы из первой части преамбулы (0,1,3,0,1,3), так как они повторяются, и по этой причине будет находиться два пика. это не есть хорошо. так как я могу пропустить нужный пик из-за замирания, и словить ложный. если брать в качестве коррелирующей последовательности обнаружения последующие символы (1,2,0), то у меня ничего не остается на расчет частотной ошибки и на измерение ИХ канала...
больше адекватных мыслей у меня нету. может у кого-нибудь есть варианты, что можно сделать...
Виктор39
Dec 9 2013, 07:52
вопрос по цифровому АРУ, которое делал по Незами. (предпочтительней, как мне кажется, экспоненциальная АРУ)
1) более правильно АРУ включать по сигналу на несущей частоте или по сигналу перенесенному на нулевую частоту?
2) при больших соотношениях сигнал/шум, при появление полезного сигнала, на выходе АРУ имеется большой скачок по амплитуде. это правильно будет ставить ограничитель на выходе АРУ?
спасибо.
Цитата(Виктор39 @ Dec 9 2013, 11:52)

вопрос по цифровому АРУ, которое делал по Незами. (предпочтительней, как мне кажется, экспоненциальная АРУ)
1) более правильно АРУ включать по сигналу на несущей частоте или по сигналу перенесенному на нулевую частоту?
2) при больших соотношениях сигнал/шум, при появление полезного сигнала, на выходе АРУ имеется большой скачок по амплитуде. это правильно будет ставить ограничитель на выходе АРУ?
спасибо.
Если сделаешь АРУ на нулевой частоте, то любая помеха, попадающая в полосу преселектора, но уже отфильтрованная на нулевой частоте перегрузит входной LNA приемника (то место, где находится регулировочный элемент АРУ определяется структурой и динамикой отдельных блоков КОНКРЕТНОГО приемника (общий случай бессмыленен - мат. модель смесителя (перемножитель) имеет бесконечный динамический диапазон)). Детектор АРУ после ограничителя? Нужен ли ограничитель, если элементы приемника и так ограничат сигнал из-за присущей им нелинейности? Помоделируй динамику КОНКРЕТНОЙ системы АРУ с ограничителем (который и так уже есть в тракте и вопрос только в уровне ограничения) и без. По результатам моделирования убедись в выполнении требований к системе АРУ.
ПС Стоит подумать о цели регулировки именно в КОНКРЕТНОМ случае - максимаизация отношения сигнал-шум, постоянный уровень сигнала на выходе и тп.
Corner
Dec 27 2013, 17:15
Цитата(andyp @ Dec 10 2013, 13:16)

Если сделаешь АРУ на нулевой частоте, то любая помеха, попадающая в полосу преселектора, но уже отфильтрованная на нулевой частоте перегрузит входной LNA приемника (то место, где находится регулировочный элемент АРУ определяется структурой и динамикой отдельных блоков КОНКРЕТНОГО приемника (общий случай бессмыленен - мат. модель смесителя (перемножитель) имеет бесконечный динамический диапазон)). Детектор АРУ после ограничителя? Нужен ли ограничитель, если элементы приемника и так ограничат сигнал из-за присущей им нелинейности? Помоделируй динамику КОНКРЕТНОЙ системы АРУ с ограничителем (который и так уже есть в тракте и вопрос только в уровне ограничения) и без. По результатам моделирования убедись в выполнении требований к системе АРУ.
ПС Стоит подумать о цели регулировки именно в КОНКРЕТНОМ случае - максимаизация отношения сигнал-шум, постоянный уровень сигнала на выходе и тп.
У человека
КВ-модем! Какой LNA?! С преселектора сразу на смеситель. Со смесителя на второй преселектор/диплексор и только потом на LNA...
Цитата(Corner @ Dec 27 2013, 21:15)

У человека КВ-модем! Какой LNA?! С преселектора сразу на смеситель. Со смесителя на второй преселектор/диплексор и только потом на LNA...
Т.е. Вы считаете, что вообще ВСЕ КВ приемники сделаны по описанной Вами схеме (с преобразованием частоты)? Динамический диапазон смесителя бесконечен? Его хватит например для того, чтобы обеспечить прием сигнала на уровне шумов при наличии помехи от собственного передатчика в режиме FDD скажем при ~10% расстройке? Впрочем на все это отвечать ТС, а не мне - все зависит от ЕГО приемника и его требований.
Corner
Dec 30 2013, 07:58
Цитата(andyp @ Dec 28 2013, 01:52)

Т.е. Вы считаете, что вообще ВСЕ КВ приемники сделаны по описанной Вами схеме (с преобразованием частоты)? Динамический диапазон смесителя бесконечен? Его хватит например для того, чтобы обеспечить прием сигнала на уровне шумов при наличии помехи от собственного передатчика в режиме FDD скажем при ~10% расстройке? Впрочем на все это отвечать ТС, а не мне - все зависит от ЕГО приемника и его требований.
1. Уровень шума на КВ, даже в тихом месте, перекрывает потери в смесителе и преселекторе.
2. Динамический диапазон от наличия усилителя не зависит. Наоборот, ставят еще и аттенюатор, дабы не перегружать смеситель. В особых случаях (например если сразу работают несколько станций рядом) делают смеситель способный "есть" до 4... 10 Вт общей мощности на входе.
Цитата(Corner @ Dec 30 2013, 11:58)

1. Уровень шума на КВ, даже в тихом месте, перекрывает потери в смесителе и преселекторе.
2. Динамический диапазон от наличия усилителя не зависит. Наоборот, ставят еще и аттенюатор, дабы не перегружать смеситель. В особых случаях (например если сразу работают несколько станций рядом) делают смеситель способный "есть" до 4... 10 Вт общей мощности на входе.
все последние приемники, с которыми сталкивался, были построены по схеме с непосредственной оцифровкой сигнала на выходе преселектора. Перенос частоты происходил в цифре. На входе ADC ставился усилитель для согласования аппертуры ADC и уровня принимаемого сигнала. Простейший анализ показывает, что минимальный уровень сигнала на входе КВ приемника будет порядка -120/-110 dBm, поэтому на входе ADC усилитель явно требуется (на входе согласующих цепей или драйвера ADC должен быть max 1 Vp-p на 50 Ohm нагрузке (~10 dBm) ну или min -70 dBm, считая динамический диапазон ADC равным 80 dB). Разумеется, на входе усилителя был аттенюатор. Им то и рулила система АРУ. Все это очень грубо, тем более я не специалист в аналоговых делах.
Corner
Dec 30 2013, 10:43
Цитата(andyp @ Dec 30 2013, 13:18)

все последние приемники, с которыми сталкивался, были построены по схеме с непосредственной оцифровкой сигнала на выходе преселектора. Перенос частоты происходил в цифре. На входе ADC ставился усилитель для согласования аппертуры ADC и уровня принимаемого сигнала. Простейший анализ показывает, что минимальный уровень сигнала на входе КВ приемника будет порядка -120/-110 dBm, поэтому на входе ADC усилитель явно требуется (на входе согласующих цепей или драйвера ADC должен быть max 1 Vp-p на 50 Ohm нагрузке (~10 dBm) ну или min -70 dBm, считая динамический диапазон ADC равным 80 dB). Разумеется, на входе усилителя был аттенюатор. Им то и рулила система АРУ. Все это очень грубо, тем более я не специалист в аналоговых делах.
Непосредственная оцифровка пока проигрывает переносу спектра в аналоге по динамическому диапазону. Если сужать полосу до 1 МГц, то можно использовать 24 бит АЦП с динамикой до 120 дБ, а если непосредственно оцифровывать, то 16 бит и 80... 84 дБ. Для КВ 90 дБ динамика это средне-плохо.
Цитата(Corner @ Dec 30 2013, 14:43)

Непосредственная оцифровка пока проигрывает переносу спектра в аналоге по динамическому диапазону. Если сужать полосу до 1 МГц, то можно использовать 24 бит АЦП с динамикой до 120 дБ, а если непосредственно оцифровывать, то 16 бит и 80... 84 дБ. Для КВ 90 дБ динамика это средне-плохо.
На счет 90 dB согласен. Это даже еще и оптимистично. Без АРУ ДД такого приемника определяется ADC и обычно меньше 80. Приходится добирать недостающее с АРУ. Я не сторонник какой-либо конкретной реализации - для объективного суждения не хватает знаний. Просто каждый раз пытаюсь понять, как выполняются требования к конкретному приемнику по динамике и блокированию. Если они выполняются, то я счастлив

и дальше уже в это не лезу.
Динамический диапазон не зависит от АРУ, усилителя и т. д. В общем случае это соотношение между максимальным напряжением (обычно на 10 дБ ниже точки компрессии) и минимальным "видимым" на его фоне напряжением на входе на двух разных каналах. Если брать в расчет АРУ, то это уже рабочий диапазон. Для КВ ДД на "отлично" это 120+ дБ, а РД до 140... 150 дБ.
Цитата(Corner @ Jan 3 2014, 18:06)

Динамический диапазон не зависит от АРУ, усилителя и т. д. В общем случае это соотношение между максимальным напряжением (обычно на 10 дБ ниже точки компрессии) и минимальным "видимым" на его фоне напряжением на входе на двух разных каналах. Если брать в расчет АРУ, то это уже рабочий диапазон. Для КВ ДД на "отлично" это 120+ дБ, а РД до 140... 150 дБ.
То, про что Вы говорите это - Desensitization dynamic range (в стареньком MIL-STD-188-141B он от 90 до 100). Я про ДД отдельных блоков преимника говорил (от уровня собственных шумов или, в случае АЦП, спуров до, скажем, точки 1-dB компрессии). В общем все понятно и со всем согласен, предлагаю прекратить, а то мы уже совсем тему украли
Цитата(andyp @ Jan 8 2014, 23:57)

То, про что Вы говорите это - Desensitization dynamic range (в стареньком MIL-STD-188-141B он от 90 до 100). Я про ДД отдельных блоков преимника говорил (от уровня собственных шумов или, в случае АЦП, спуров до, скажем, точки 1-dB компрессии). В общем все понятно и со всем согласен, предлагаю прекратить, а то мы уже совсем тему украли

Да эта тема вообще далека от топика... ее надо переименовать в "структура декодера при 8psk"
Саша15
May 26 2014, 00:40
Цитата(alex_os @ Sep 24 2013, 01:29)

Скорее так:
errors = errors + (R(i+16) - Restim(i+16)).*conj( R(i+16: -1: i ) ) ; % суммируем
Ошибка это скаляр, а R(i:i+16) задержанные входные отсчеты.
Да вы обычный LMS прикрутите а потом его в блочный легко сможете переделать .
Здравствуйте! У меня к вам вопрос по реализации данного этапа расчета ошибки. В данном случае если (если я все правильно понимаю)
R = RxBuffer(16 + cnEstimate:64);
Restim = [B' pilot_modulated'];
То тогда алгоритм выглядит так
for cnEstimate = 1:32
B = decide(RxBuffer(17:64), RxBuffer(1:16 + cnEstimate - 1), pilot_modulated, weight, len_pilot + cnEstimate -1, len_pilot, len_pilot);
E = [RxBuffer(16 + cnEstimate:64)] - [ B.' pilot_modulated];
R = RxBuffer(16 + cnEstimate:64);
Restim = [B' pilot_modulated'];
for i = 1:(48-17)
errors = E;
errors = errors + (R(i+16) - Restim(i+16)).*conj( R(i+16: -1: i ) ) ; % суммируем
end
EE = errors/(48-17); % и усредняем ошибку
% обновляем коэффициенты фильтра с учетом рассчитаной ошибки
weight = weight + step_size*EE;
% принимаем решение для одного символа
[e,idx]=min(abs(B(1) - c8));
DecideData = [DecideData c8(idx)];
end
но на этом этапе матлаб говорит о том, что матрицы не согласованы по размерам, именно здесь
errors = errors + (R(i+16) - Restim(i+16)).*conj( R(i+16: -1: i ) ) ;
В чем моя ошибка?