Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Demodulat0r O F D M
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Dub01
Нашёл в сети исходник на MatLab'e по генерации, передачи и получению OFDM сигнала, но у меня задача другая. Имеется сигнал OFDM, записанный с эфира. Надо его прослушать, т.е. демодулировать. Коверкался с исходником, так ничего и не получилось.

Уважаемые эксперты! Помогите, может у кого завалялся демодулятор OFDM сигналов!? Заранее большое спасибо. smile.gif
WEST128
Насколько мне известно, ортогональное частотное мультиплексирование - всего лишь метод, суть которого в разбиении частотного канала на несколько частотных подканалов. Сами же подканалы могут иметь любой известный вид модуляции, поэтому демодулятор OFDM в принципе состоит из многоканального приемника и устройства объеденения потоков подканалов (в случае цифрового сигнала). Не зная схемы модуляции подканалов и схемы разбиения цифрового потока на подканалы, говорить о приеме такого сигнала просто бессмысленно.
Dub01
Цитата(WEST128 @ Aug 25 2007, 15:17) *
Насколько мне известно, ортогональное частотное мультиплексирование - всего лишь метод, суть которого в разбиении частотного канала на несколько частотных подканалов. Сами же подканалы могут иметь любой известный вид модуляции, поэтому демодулятор OFDM в принципе состоит из многоканального приемника и устройства объеденения потоков подканалов (в случае цифрового сигнала). Не зная схемы модуляции подканалов и схемы разбиения цифрового потока на подканалы, говорить о приеме такого сигнала просто бессмысленно.

Всё так. Сигнал уже есть. Записан с эфира. Хочу послушать. Но нет у меня подходящего демодулятора. Хоть бы какой простой демодулятор подсказали(в идеале надо чтоб по каждому подканалу можно было выбирать вид модуляции и соответственно ей демодуляцию), знал бы от чего отталкиваться. help.gif
WEST128
А что известно про источник сигнала ?
AVR
Извините за оффтоп, тоже вопросик есть...
Есть запись сигнала, параметры которого полностью известны, но вот демодулировать его у меня не получается... В каждом символе есть небольшая копия конца символа (guard интервал) и сам символ. При движении "окна" DFT по всему этому символу амплитуды ессно остаются почти одинаковыми, но вот фазы крутятся...
Если удачно подогнать смещение от начала, то этот поворот будет таким что его можно скорректировать по pilot-поднесущим (фаза откладывается по вертикали от -180 до + 180):
Нажмите для просмотра прикрепленного файла
А если не повезет, то так:
Нажмите для просмотра прикрепленного файла
Во втором случае, наверное, ничто не поможет...
Подскажите, пожалуйста, что может быть не так, как быть...
Может частота дискретизации немного не верно выбрана что приводит к такому поведению фаз?..
alex_os
Цитата(AVR @ Aug 29 2007, 00:28) *
В каждом символе есть небольшая копия конца символа (guard интервал) и сам символ. При движении "окна" DFT по всему этому символу амплитуды ессно остаются почти одинаковыми, но вот фазы крутятся...

Не понял, окно DFT вдоль одного символа смещается у Вас? Вы один канал пытаетесь обработать таким образом?
Цитата(AVR @ Aug 29 2007, 00:28) *
Может частота дискретизации немного не верно выбрана что приводит к такому поведению фаз?..

если частота дискретизации неправильная то все ломается smile.gif. Многие звуковухи вместо оцифровки на 8000 кГц цифруют на частоте Гц на 50 меньшей. Вообщем осторожно нужно с этим...
AVR
Цитата(alex_os @ Aug 30 2007, 09:10) *
Не понял, окно DFT вдоль одного символа смещается у Вас? Вы один канал пытаетесь обработать таким образом?

Запись сигнала в IQ форме, т.е. комплексной, два канала получается. Под окном я подразумеваю то что есть OFDM символ, который состоит из собственно самого информационного символа и из его небольшой части, которая подставлена вперед. Комплексное DFT я беру ессно с точностью на время информационного символа. Начальный отсчет может быть сдвинут "влево" по времени на время длительности этой копии, т.е. это окно у меня движется в пределах одного OFDM символа...
Цитата(alex_os @ Aug 30 2007, 09:10) *
если частота дискретизации неправильная то все ломается smile.gif. Многие звуковухи вместо оцифровки на 8000 кГц цифруют на частоте Гц на 50 меньшей. Вообщем осторожно нужно с этим...
т.е. как понять "ломается"? Это значит что у меня как раз тот самый случай?
alex_os
Цитата(AVR @ Aug 30 2007, 23:40) *
Запись сигнала в IQ форме, т.е. комплексной, два канала получается. Под окном я подразумеваю то что есть OFDM символ, который состоит из собственно самого информационного символа и из его небольшой части, которая подставлена вперед. Комплексное DFT я беру ессно с точностью на время информационного символа. Начальный отсчет может быть сдвинут "влево" по времени на время длительности этой копии, т.е. это окно у меня движется в пределах одного OFDM символа...
т.е. как понять "ломается"? Это значит что у меня как раз тот самый случай?

А на картинке фаза крутится для одной несущей?
Вообщем, лучше бросить смотреть на непонятную фазу и делать так:
1) Правильно спозиционировать "окно DFT". Для этого считаете корреляцию защитного интервала и последнего куска символа длинной в защитный интервал. Т.е.
Ls - длина символа
Lg - длина защитного интервала
Lu - длина окна
s - Ваш сигнал (вектор-строка)
Ns - длина сигнала в символах

в Матлабовской нотации:
Код
for offset = 1:Ls
    r(offset) = 0;
    index1 = offset;
    index2 = offset+Lu;  
    for i = 1: Ns
        r(offset) = r(offset) + r(index1: index1+Lg-1) * r(index2: index2+Lg-1)';
        index1 = index1+Ls;  index2=index2+Ls;  
    end
end

Идея такая когда защитный интервал и его копия совпадут корреляция будет максимальна. Это широкоизвестный способ символьной синхронизации для ОFDM. Длинна выборки должны быть довольна значительна (порядка сотни символов). График abs( r ) имеет характерную треугольную форму ширина основания треугольника примерно 2*Lg. При отклонении частоты дикретизации от истинной треугольник скругляется, если сильное отклонение вообще исчезает.

2) Если треугольник получился, тогда пол-дела сделано, позиционируется начало вашего окна на offset соответсвующий максимуму(max_offset) r + Lg/2. Считаете ДПФ и пытаетесь увидеть пилоты. Кстати arg(r(max_offset)) величина пропорциональная сдвигу несущей.

Еще по гуглите "OFDM timing recovery" найдете массу ссылок.

ps: а что за сигнал у Вас, если не секрет?
Dub01
Спецам, касательно ОФДМ:

1)На счёт циклического префикса. Интересует следующее. Как правильно задать размер? На что именно он повлияет. + и - больших и малых GT.

2)Касательно ТИПА префикса. Какой вид циклического префикса использовать?, или стандартный, когда часть отсчетов из начала добавляется в конец, или другой, когда в конец просто дописываются нули. Какие положительные и отрицательные стороны у обоих?.

Какая именно часть отсчётов добавляется в конец? сколько 0?

3)Ещё вопрос касательно рациональности выбора числа поднесущих. Каков подход, опять же +/-

4)Читал что частотный разнос каналов = скорости манипуляции. Так ли это на самом деле? И как задаётся эта скорость? На что влияет?
zhorro
Цитата(Dub01 @ Nov 11 2007, 13:46) *
1)На счёт циклического префикса. Интересует следующее. Как правильно задать размер? На что именно он повлияет. + и - больших и малых GT.


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

Цитата(Dub01 @ Nov 11 2007, 13:46) *
2)Касательно ТИПА префикса. Какой вид циклического префикса использовать?, или стандартный, когда часть отсчетов из начала добавляется в конец, или другой, когда в конец просто дописываются нули. Какие положительные и отрицательные стороны у обоих?.


Добавление нулей имеет положительный момент, что у тебя не появятся нули в оценке частотной характеристики, минус - гораздо более сложная организация приемника. Тут простым БПФ не обойтись, так как свертка с каналом уже не бкдет считаться циклической.

Цитата(Dub01 @ Nov 11 2007, 13:46) *
Какая именно часть отсчётов добавляется в конец? сколько 0?


Отсчеты добавляются вначало, из конца. Впринципе конечно ни кто не мешает сделать наоборот, но как то классически добавляется последних К отсчетов к началу

Цитата(Dub01 @ Nov 11 2007, 13:46) *
3)Ещё вопрос касательно рациональности выбора числа поднесущих. Каков подход, опять же +/-


Тут все зависит от длины выбранного ЦП. Если ЦП 100 отсчетов, то использование БПФ на 128 не рационально ;-)
С другой стороны, использование слишкои больших БПФ приводит к огромному пик-фактору, что конечно так же не приятно/

Цитата(Dub01 @ Nov 11 2007, 13:46) *
4)Читал что частотный разнос каналов = скорости манипуляции. Так ли это на самом деле? И как задаётся эта скорость? На что влияет?


частотный разнос каналов = частота дискретизации/(размер бпф+ЦП), при чем тут скорость манипуляции?
Alex65111
Цитата
Добавление нулей имеет положительный момент, что у тебя не появятся нули в оценке частотной характеристики
- поподробней можно пояснить, что за нули, почему берутся и что за оценка частотной характеристики - чего?
Dub01
zhorro
Спасибо за помощь.
Цитата
частотный разнос каналов = частота дискретизации/(размер бпф+ЦП), при чем тут скорость манипуляции?

А чем тогда определяется скорость?
zhorro
Цитата(Alex65111 @ Nov 16 2007, 21:08) *
- поподробней можно пояснить, что за нули, почему берутся и что за оценка частотной характеристики - чего?

Для наиболее эффективного использования канала связи необходимо организовать когерентный прием, а для этого необходимо оценить частотную характеристику канала. В ней как раз и могут появиться нули, а значит на этой поднесущей связи не будет.
Dub01
Цитата(zhorro @ Nov 19 2007, 09:38) *
Добавление нулей имеет положительный момент, что у тебя не появятся нули в оценке частотной характеристики, минус - гораздо более сложная организация приемника. Тут простым БПФ не обойтись, так как свертка с каналом уже не бкдет считаться циклической.


А что нам даёт циклическая свертка?, даже если она не будет циклической, и что тогда? И какой БПФ необходим в таком случае? 07.gif
zhorro
Цитата(Dub01 @ Dec 5 2007, 23:22) *
А что нам даёт циклическая свертка?, даже если она не будет циклической, и что тогда? И какой БПФ необходим в таком случае? 07.gif


Циклическая свёртка даёт возможность считать, что принятый символ циклически свернут с каналом, а в этом случае можно считать, что принятый символ после БПФ будет представлять собой передаваемое распределение по созвездиям умноженное на комплексный коэффициент передачи канала.
Если свёртка будет не циклической необходимы укорачивающие фильтры, которые приведут длину сквозной ИХ канала к длине ЦП.
Dub01
Цитата(zhorro @ Dec 7 2007, 09:27) *
Циклическая свёртка даёт возможность считать, что принятый символ циклически свернут с каналом, а в этом случае можно считать, что принятый символ после БПФ будет представлять собой передаваемое распределение по созвездиям умноженное на комплексный коэффициент передачи канала.
Если свёртка будет не циклической необходимы укорачивающие фильтры, которые приведут длину сквозной ИХ канала к длине ЦП.

Так, снова поднимаем тему. Сейчас есть вопрос касательно СИНХРОНИЗАЦИИ.

Собственно проблема в том, как нам правильно продемодулировать сигнал? Т.е. есть к примеру запись с частотой дискретизации fs=8000 Гц. Нам для приёма сигнала необходимо правильно выставить размер блока FFT на входе, т.е. правильно выбрать N точек Фурье. (чтобы отсчёты брались именно на поднесущих, а не где попало) Так вот собственно каков алгоритм выбора числа точек FFT для заданной частоты дискретизации?. Ведь мы можем продискретизировать сигнал и тем самым подвести его под нужный размер N ФФТ. Причём необходимо чтоб это укладывалось в пределах ОФДМ символа.
alex_os
Цитата(Dub01 @ Apr 30 2008, 17:51) *
Так, снова поднимаем тему. Сейчас есть вопрос касательно СИНХРОНИЗАЦИИ.

Собственно проблема в том, как нам правильно продемодулировать сигнал? Т.е. есть к примеру запись с частотой дискретизации fs=8000 Гц. Нам для приёма сигнала необходимо правильно выставить размер блока FFT на входе, т.е. правильно выбрать N точек Фурье. (чтобы отсчёты брались именно на поднесущих, а не где попало) Так вот собственно каков алгоритм выбора числа точек FFT для заданной частоты дискретизации?. Ведь мы можем продискретизировать сигнал и тем самым подвести его под нужный размер N ФФТ. Причём необходимо чтоб это укладывалось в пределах ОФДМ символа.

Да вроде тут Вам написали smile.gif http://www.telesys.ru/wwwboards/dsp/299/me...es/107400.shtml
Dub01
При Fs=7200кГц и Fft=128 точек получим частотный разнос 56.25Гц(это хорошо), а вот по длительности всего 17.8мс (t=Fft/Fs), а по стандарту M39 должно быть 22.5мс. (Хотя уже подсказали что 17.8 это без учёта защитного интервала, но я честно не нашёл про него в стандарте, вот про преамбулу чётко написано 517мс - т.е. у меня тут вопрос откуда 4.7мс и удовлетворяет ли это стандарту).

И ещё вопрос. Если бы частот было не 39, а больше или меньше, каков был бы алгоритм прикидывания Fs и Fft для неё с учётом длительности символа(окна)?
Dub01
Итак, после длительного отсутствия, появились некоторые важные вопросы касательно того же MIL-STD-188-110B - 39ка. Как уже писал, имеется некоторый записанный с эфира сигнал данного стандарта, необходимо его обработать, т.е. правильно демодулировать, осуществить синхронизацию, выделить начальную точку нарезки с которой начинается полезный информационный поток... Сигнал записан с частотой дискретизации fs=8000Гц. На первом этапе обработки происходит передискретизация на частоту fs=7200Гц методом интерполяции. В итоге получили новый вектор отчётов, но уже с частотой дискретизации 7200Гц. При 7200 выполняется условие, при котором отсчёты берутся именно на поднесущих частотах а не где-то рядом, т.е. бины лежат на несущих. 7200/128 = 56.25Гц - как раз разнос между поднесущими по стандарту. На втором этапе нелбходимо найти точку(отсчёт) с которого необходимо нарезать символы как таковые, т.е. найти точку где заканчивается синхра (4 немодулированных тона и за ними ещё 3 модулированные несущие частоты). У меня этот процесс реализован следующим образом. Задаётся некоторое окно отсчётов, для примера k=500. Этим окном скользим(смещаем) по нашему вектору отсчётов(кот. уже с fs=7200) и строим спектр. По стандарту 4 тона имеют следующие частоты: 787.5, 1462.5, 2137.5 и 2812.5 Гц соответственно, а на нашем спектре получается что частоты гуляют около этих значений +-пару Гц. При этом разнос между тонами на спектре, естественно, сохраняется и равен 675Гц.
ВОПРОС: как и что необходимо сделать для правильной частотной синхронизации?

Далее как планируется, чтобы найти точку нарезки(конца синхры и начала полезного информационного сигнала) необходимо настроить фильтры на эти самые несущие(4 тона). И на выходе фильтров усреднить огибающие, по уровню 0.707 замерить длительность, и тем самым найти эту точку(отсчёт). Фильтры по идеи надо реализовывать на основе Фурье. Вот только не ясно, ведь сама процедура усреднения - уже с погрешностью, т.е. и по времени не будет точной синхронизации.
ВОПРОС: насколько правильный данный алгоритм? И как правильно реализуется временная синхронизация? Ведь очень важно правильно определить точку нарезки.
AVR
Цитата(Dub01 @ Jul 9 2008, 21:30) *
ВОПРОС: как и что необходимо сделать для правильной частотной синхронизации?
Для этого необходимо... читать литературу smile.gif Чтобы определить частотный сдвиг, надо сравнить и усреднить по нескольким отсчетам например разность фаз между циклическим префиксом и исходной копией - там 100% будет прямолинейная закономерность, зависящая от частотной ошибки. Если в стандарте есть преамбула из повторяющихся во времени сигналов - тут так вообще ещё ярче это всё проявится.
Цитата(Dub01 @ Jul 9 2008, 21:30) *
ВОПРОС: насколько правильный данный алгоритм? И как правильно реализуется временная синхронизация? Ведь очень важно правильно определить точку нарезки.
Подсказка: автокорреляция сигнала (до FFT) - если префикс большой - то замечательно, если маленький - вся надежда на преамбулу если есть или на другие свойства символа в конкретном стандарте wink.gif
Alex65111
Пока OFDMом сильно не занимаюсь, но все равно интересно.
Цитата
Чтобы определить частотный сдвиг, надо сравнить и усреднить по нескольким отсчетам например разность фаз между циклическим префиксом и исходной копией
. - Вроде как и логично, но...
1. Чтоб применять такой подход требуется предварительная жесткая временная синхронизация, так?
2. А для чего тогда судя по сообщению DUB01 в OFDM в MIL в начале передачи существуют 3 потом 4 голые несухи, разве не для частотной синхронизации?
AVR
Цитата(Alex65111 @ Jul 22 2008, 21:24) *
1. Чтоб применять такой подход требуется предварительная жесткая временная синхронизация, так?
Моя практика показывает что надо знать лишь приблизительное положение во времени этого участка, например если в сигнале есть преамбула, то хитрыми методами корреляции можно найти положение +/- 2 отсчета, а потом и частотную ошибку можно измерить wink.gif
Суть в том, что из-за частотной ошибки за время передачи символа от префикса до начала копии набегает соответствующая фазовая ошибка, а уж по ней можно достаточно точно измерить частотную ошибку smile.gif
Alex65111
1.
Цитата
то хитрыми методами корреляции
- это хитрая корреляция или хитрый метод вычисления корреляции?

2.
Цитата
Суть в том, что из-за частотной ошибки за время передачи символа от префикса до начала копии набегает соответствующая фазовая ошибка
- это то как раз я и понял. Вопрос то был, а зачем в МИЛ на входе используются последовательно голые 3-4 несухи. Разве не для частотной синхронизации?, если да, то как на их основе синхронизироваться? Ваш подход я думаю будет замечательным для соправождения.
AVR
Цитата(Alex65111 @ Jul 23 2008, 10:45) *
1. - это хитрая корреляция или хитрый метод вычисления корреляции?
Я использую "скользящую корреляцию", т.е. есть буфер, где хранятся значения корреляции, и есть просто суммарное значение корреляции и каждый такт добавляю к нему текущее значение, и вычитаю самое старое значение - метод супер быстрый и эффективный...
Цитата
2. - это то как раз я и понял. Вопрос то был, а зачем в МИЛ на входе используются последовательно голые 3-4 несухи. Разве не для частотной синхронизации?, если да, то как на их основе синхронизироваться? Ваш подход я думаю будет замечательным для соправождения.
Сори, а что за МИЛ? Я так и не понял о каком стандарте/методе идет речь? Где можно почитать про это? Интересно...
Alex65111
Цитата
Итак, после длительного отсутствия, появились некоторые важные вопросы касательно того же MIL-STD-188-110B
- от себя добавлю, это коротковолновый стандарт, в нем есть приложение B, который описывает передачу на 39 поднесущих где в начале передается 4 голых несухи, потом 3, потом уже инфа на 39. Более глубоко пока сам не копал.
AVR
Цитата(Alex65111 @ Jul 23 2008, 11:04) *
- от себя добавлю, это коротковолновый стандарт, в нем есть приложение B, который описывает передачу на 39 поднесущих где в начале передается 4 голых несухи, потом 3, потом уже инфа на 39. Более глубоко пока сам не копал.
Нашел типа спецификацию всего этого безобразия... Я думал IEEE делает самую худшую документацию, оказывается есть ещё более "умелые" товарищи... Так и не понял где там OFDM? Где хоть один рисунок, показывающий какие несущие какую роль играют и т.д. ?..
Alex65111
Стр.62 стандарта

MIL-STD-188-110B
APPENDIX B

39-TONE PARALLEL MODE
Dub01
Кто-нибудь может объяснить принцип работы данных схем? help.gif (статья Wireless OFDM Systems: How to Make Them Work? )
Временная синхронизация с пом. циклического префикса:

Частотная синхронизация с пом. циклического префикса:
Dub01
К вопросу о синхронизации, наткнулся на статью A robust timing and frequency offset estimation OFDM. Там описан процесс синхронизации, без использования pilot тонов, а точнее процесс оценки ошибки временного ухода (timing offset) и частотного (frequency offset), что в принципе и необходимо для схемы синхронизации. Сама статейка очень маленькая, из того что там видно, они симулируют запаздывание, например на 1 отсчёт и строят сигнальные созвездия до запаздывания и после(возводят сигнал в 4 степень). В итоге получают сигнальное созвездие (4th poweк constellation) с одной точкой. И по нему оценивают ошибку.

Попытался смоделировать это в Matlab'e но ничего подобного получить не смог. Вот например 1 рисунок Figure 3 - Transmit tone phase vs. tone number - который отображает сигнал без задержки и с задержкой в 1 отсчёт (картинка получается с явным наклоном, т.е. как бы поворачивается) - у меня такого не наблюдалось! Возможно я что-то не понял, поэтому прошу помощи, если кто-то знает подобный алгоритм или у кого есть более подробный документ, где можно почитать про данный алгоритм оценки, буду очень признателен за помощь!
DMax
Цитата(Dub01 @ May 4 2008, 20:25) *
При Fs=7200кГц и Fft=128 точек получим частотный разнос 56.25Гц(это хорошо), а вот по длительности всего 17.8мс (t=Fft/Fs), а по стандарту M39 должно быть 22.5мс. (Хотя уже подсказали что 17.8 это без учёта защитного интервала, но я честно не нашёл про него в стандарте, вот про преамбулу чётко написано 517мс - т.е. у меня тут вопрос откуда 4.7мс и удовлетворяет ли это стандарту).


22.5 - 17.8 = 4.7 = 17.8 / 4
То есть защитный интервал равен одной четверти OFDM-символа - довольно часто встречающаяся в OFDM практика, хотя бывает и короче. Защитный интервал представляет собой копию последней четверти OFDM-символа, но передается перед самим символом.


Цитата(AVR @ Jul 22 2008, 16:17) *
Подсказка: автокорреляция сигнала (до FFT) - если префикс большой - то замечательно, если маленький - вся надежда на преамбулу если есть или на другие свойства символа в конкретном стандарте wink.gif


Автокорреляция в OFDM во временной области не эффективна - очень широкий и не выраженный пик. Лучше детектить преамбулу путем автокорреляции в частотной области - точнее автокоррелировать амплитуды поднесущих с амлитудой пилотов в преамбуле. Это позволить задетектировать преамбулу в плюс-минус guard-интервале. Дальнейшее надо предоставить эквалайзеру.

Цитата(AVR @ Aug 28 2007, 23:28) *
Извините за оффтоп, тоже вопросик есть...
Есть запись сигнала, параметры которого полностью известны, но вот демодулировать его у меня не получается... В каждом символе есть небольшая копия конца символа (guard интервал) и сам символ. При движении "окна" DFT по всему этому символу амплитуды ессно остаются почти одинаковыми, но вот фазы крутятся...
Если удачно подогнать смещение от начала, то этот поворот будет таким что его можно скорректировать по pilot-поднесущим (фаза откладывается по вертикали от -180 до + 180):
Нажмите для просмотра прикрепленного файла
А если не повезет, то так:
Нажмите для просмотра прикрепленного файла
Во втором случае, наверное, ничто не поможет...
Подскажите, пожалуйста, что может быть не так, как быть...
Может частота дискретизации немного не верно выбрана что приводит к такому поведению фаз?..


Нет, ты промахнулся окном мимо начала символа. Читай теорему о сдвиге ДПФ. Вот используя наклон линии фазы можно с точностью до десятой части (точность зависит от SNR) сэмла прикинуть на сколько ты промахнулся. Это можно использовать для синхронизации.

Более того, прямую линию фазы ты не получишь никогда. И причиной тому служат несколько вещей:
1) Не синхронизированны генераторы приемника и передатчика
2) Частотный сдвиг

Первый пункт можно исправить построив по преамбуле эквалайзер, который ты будешь применять ко всем последующим OFDM-символам. Он будет докручивать твои поднесущие так, чтобы линия фазы была прямой.
Частотный сдвиг нужно компенсировать путем детектирования и последующего вычета частоты расхождения из сигнала.
petrov
Цитата(Dub01 @ Dec 7 2008, 14:23) *
К вопросу о синхронизации, наткнулся на статью A robust timing and frequency offset estimation OFDM. Там описан процесс синхронизации, без использования pilot тонов, а точнее процесс оценки ошибки временного ухода (timing offset) и частотного (frequency offset), что в принципе и необходимо для схемы синхронизации. Сама статейка очень маленькая, из того что там видно, они симулируют запаздывание, например на 1 отсчёт и строят сигнальные созвездия до запаздывания и после(возводят сигнал в 4 степень). В итоге получают сигнальное созвездие (4th poweк constellation) с одной точкой. И по нему оценивают ошибку.

Попытался смоделировать это в Matlab'e но ничего подобного получить не смог. Вот например 1 рисунок Figure 3 - Transmit tone phase vs. tone number - который отображает сигнал без задержки и с задержкой в 1 отсчёт (картинка получается с явным наклоном, т.е. как бы поворачивается) - у меня такого не наблюдалось! Возможно я что-то не понял, поэтому прошу помощи, если кто-то знает подобный алгоритм или у кого есть более подробный документ, где можно почитать про данный алгоритм оценки, буду очень признателен за помощь!


Вот вам пример симулинк модель подобной синхронизации:
http://electronix.ru/forum/index.php?s=&am...st&p=513268

Там правда не OFDM а FMT, но в данном случае не имеет значения, в FMT поднесущие не перекрываются, нету ICI, нет нужды в защитном интервале.
Dub01
Цитата(petrov @ Dec 8 2008, 16:35) *
Вот вам пример симулинк модель подобной синхронизации:
http://electronix.ru/forum/index.php?s=&am...st&p=513268

Там правда не OFDM а FMT, но в данном случае не имеет значения, в FMT поднесущие не перекрываются, нету ICI, нет нужды в защитном интервале.


Спасибо за отличную модельку! Я посмотрел её, но честно сказать она у Вас построена не потому алгоритму, про который указывалось в статье... Например того же возведения в 4 степень у Вас я нигде не нашёл. Я не специалист в simulink'е, поэтому если мои вопросы покажутся смешными, прошу извинить:

1)Во-первых, поясните пожалуйста почему и для чего Вы чуть ли не в каждом блоке ставите цифровой синтезатор частоты (NCO)? Он присутствует в блоке fmt_modulator, на главной схеме, далее внутри блока two_sps_clock_domain2, в polyphase_FIR_filter, а также в two_sps_clock_domain. Скажите как они связаны между собой и на каких частотах функционируют?

Я выполнил цветовую маркировку блоков (Format-Port/Signal Displays -> Sample Time Colors) и у меня вся схема была одного цвета( Это нормально? У Вас ведь столько стробирующих синтезаторов!

2)Во-вторых, поясните как Вы реализовали полифазный фильтр. Пользуюсь описанием http://www.tsi.lv/RSR/vol03/RSR1999v03-10.pdf я с трудом смог сопоставить с Вашей реализацией.

На входе как я понял [576x1] блок данных, далее этот блок преобразуется в 2х мерную матрицу [36x16], затем транспонирование в [16x36] параллельно заводится похожая линия ИХ канала. Всё это перемножается и получается некий новый блок данных [16x36]. А вот далее у Вас идёт блок Select Columns (Выбор столбцов). Объясните по какому критерию идёт отбор? ({1:4, 5:32, 33:36} - почему именно так?) В результате получаем кстате уже [16x32] блок данных, т.е. 4 строчки отсеяли...

Там ещё у Вас усилитель с коэф. усиления = 1 - какой смысл этого элемента?

3)Как я понял, Ваша моделька - эмуляция 12 канальной системы. Синхронизация осуществляется по схеме Гарднера. Поэкспериментировав с параметрами phase offset & frequency offset пришёл к выводу что схема довольно точно подстраивается по частоте, но при значении 1/2^3 Гц она очень долго отрабатывала. Есть ли какие-нибудь предложения по модификации или доработки текущей модели с целью увеличения производительности и запаса по задержкам (phase offset & frequency offset)?

Цитата(DMax @ Dec 8 2008, 12:35) *
Автокорреляция в OFDM во временной области не эффективна - очень широкий и не выраженный пик. Лучше детектить преамбулу путем автокорреляции в частотной области - точнее автокоррелировать амплитуды поднесущих с амлитудой пилотов в преамбуле. Это позволить задетектировать преамбулу в плюс-минус guard-интервале. Дальнейшее надо предоставить эквалайзеру.

Я как раз реализовал синхронизацию во временной области, по средствам автокорреляции циклического префикса. Действительно пики достаточно широкие, но по ним можно с погрешностью +-3 отсчёта засинхронизироваться. Ну а для совсем точной синхронизации можно рассмотреть модельку господина petrov'a, с которой я потихоньку стараюсь разобраться.

Что касается Вашего предложения синхронизоваться по преамбуле, то тут нужно сказать что не во всех сигналах она присутствует, точно также как и пилот-тон , а циклический префикс используется почти всегда (кстате он специально предназначался не только для борьбы с замираниями в каналах и с МСИ, но и для частотной и временной синхронизации). Хотя не буду спорить, возможно если есть преамбула или пилот, то по ним проще и лучше синхронизироваться. У Вас есть какие-нибудь результаты?
petrov
Цитата(Dub01 @ Dec 10 2008, 21:12) *
Спасибо за отличную модельку! Я посмотрел её, но честно сказать она у Вас построена не потому алгоритму, про который указывалось в статье... Например того же возведения в 4 степень у Вас я нигде не нашёл.


Возведение в четвёртую степень это умножение фазы на 4, смотрите в блоке phase_sync. Не забывайте что метод возведения в четвёртую степень работает только для QPSK.

Цитата(Dub01 @ Dec 10 2008, 21:12) *
Я не специалист в simulink'е, поэтому если мои вопросы покажутся смешными, прошу извинить:

1)Во-первых, поясните пожалуйста почему и для чего Вы чуть ли не в каждом блоке ставите цифровой синтезатор частоты (NCO)? Он присутствует в блоке fmt_modulator, на главной схеме, далее внутри блока two_sps_clock_domain2, в polyphase_FIR_filter, а также в two_sps_clock_domain. Скажите как они связаны между собой и на каких частотах функционируют?


NCO просто базовый элемент в алгоритмах синхронизации. На главной странице NCO работает на фиксированной частоте 6 блоков отсчётов на символ(6 отсчётов нужно для того чтобы интерполятор farrow не искажал сигнал), two_sps_clock_domain на частоте два отсчёта на символ но уже синхронно с частотой символов(2 отсчёта нужно для детектора временной ошибки Гарднера), внутри последний тайм домен работает с частотой одного отсчёта на символ(там и вычисляются все алгоритмы синхронизации). В полифазном фильтре NCO нужен для перестановки элементов матрицы в соответствии с принципом работы некритически семплированного банка фильтров.


Цитата(Dub01 @ Dec 10 2008, 21:12) *
Я выполнил цветовую маркировку блоков (Format-Port/Signal Displays -> Sample Time Colors) и у меня вся схема была одного цвета( Это нормально? У Вас ведь столько стробирующих синтезаторов!


Это как вам понравится. smile.gif

Цитата(Dub01 @ Dec 10 2008, 21:12) *
2)Во-вторых, поясните как Вы реализовали полифазный фильтр. Пользуюсь описанием http://www.tsi.lv/RSR/vol03/RSR1999v03-10.pdf я с трудом смог сопоставить с Вашей реализацией.


Вот почитайте вводную статью и неплохую диссертацию по FMT:
http://www.comsoc.org/ci/private/2000/may/pdf/olcer.pdf
http://www.cl.cam.ac.uk/research/dtg/publi...s286/thesis.pdf


Цитата(Dub01 @ Dec 10 2008, 21:12) *
На входе как я понял [576x1] блок данных, далее этот блок преобразуется в 2х мерную матрицу [36x16], затем транспонирование в [16x36] параллельно заводится похожая линия ИХ канала. Всё это перемножается и получается некий новый блок данных [16x36]. А вот далее у Вас идёт блок Select Columns (Выбор столбцов). Объясните по какому критерию идёт отбор? ({1:4, 5:32, 33:36} - почему именно так?) В результате получаем кстате уже [16x32] блок данных, т.е. 4 строчки отсеяли...


Тут сложно в рамках форума подробно описать. Ведь по сути это 12 каналов обычного QPSK, их можно традиционным способом сформировать и демодулировать, но если внимательно в матричном виде расписать групповую обработку то становится очевидно что можно гетеродины заменить на FFT, поменять местами FFT и полифазные фильтры, точнее вообще один полифазный фильтр останется на все каналы. Причём для простоты понимания можно вообще 4 или 8 каналов рассмотреть и коротенький полифазный фильтр, для начала лучше критически семплированный банк фильтров взять.

Цитата(Dub01 @ Dec 10 2008, 21:12) *
Там ещё у Вас усилитель с коэф. усиления = 1 - какой смысл этого элемента?


Нету никакого смысла. smile.gif


Цитата(Dub01 @ Dec 10 2008, 21:12) *
3)Как я понял, Ваша моделька - эмуляция 12 канальной системы. Синхронизация осуществляется по схеме Гарднера. Поэкспериментировав с параметрами phase offset & frequency offset пришёл к выводу что схема довольно точно подстраивается по частоте, но при значении 1/2^3 Гц она очень долго отрабатывала. Есть ли какие-нибудь предложения по модификации или доработки текущей модели с целью увеличения производительности и запаса по задержкам (phase offset & frequency offset)?


По схеме гарднера осуществляется только символьная синхронизация. Фазовая как раз по принципу описанному в вашей статье. Вы заметили наверно что в литературе разделяют две фазы синхронизации acquisition и tracking, так вот по частоте в модели это tracking, если нехватает полосы захвата или слишком долго настраивается ищите другие методы типа acquisition.
Leshii
Цитата
NCO просто базовый элемент в алгоритмах синхронизации. На главной странице NCO работает на фиксированной частоте 6 блоков отсчётов на символ(6 отсчётов нужно для того чтобы интерполятор farrow не искажал сигнал), two_sps_clock_domain на частоте два отсчёта на символ но уже синхронно с частотой символов(2 отсчёта нужно для детектора временной ошибки Гарднера), внутри последний тайм домен работает с частотой одного отсчёта на символ(там и вычисляются все алгоритмы синхронизации). В полифазном фильтре NCO нужен для перестановки элементов матрицы в соответствии с принципом работы некритически семплированного банка фильтров.


Если у Вас NCO работают на разных частотах, то почему подсветка соединительных линий по признаку скорости оказывается одинаковой?
petrov
Цитата(Leshii @ Dec 11 2008, 14:41) *
Если у Вас NCO работают на разных частотах, то почему подсветка соединительных линий по признаку скорости оказывается одинаковой?


Вы на FPGA не разрабатывали ничего? Когда все цифровая схема работает на одной тактовой частоте(аналог sample time в симулинке), а работа частей схемы на более низкой частоте реализуется через enable триггеров. Под частотой в модели я имел ввиду частоту разрешения(enable) вычислений на каком то тактовом интервале(sample time).
Leshii
Не могли бы Вы все таки немного подробнее разъяснить нюансы синхронизации симулинковской модели, а то от всевозможных sample time голова кругом идет.
1. sample time всей модели или задающий такт где определяется и чему равен? Не 1/36 как в модуле unit delay (fmt_modulator)?
2. С выхода NCO (fmt_modulator) мы получаем 1 импульс на 36 входных тактов?
Почему содержимое выходов sel и underflow идентично? В чем смысл тогда двух выходов, можно же было через один?
3. В блоке baud_clock_domain перед ifft почему используется vert cat, а не буфер?, и в чем смысл добавления 20 нулей?
4. На выходе polyphase_FIR_filter вместо блоков по 32 отсчета появляются блоки по 36 отсчетов, с чем связано такое преобразование?
5. Что дает блок signal specification с принудительным указанием sample time?, вроде раньше 1/36 уже задавалась?
6. В чем суть задания на стороне передатчика задержки на 23 такта модели?
7. В блоке awgn channel зачем опять указывать symbols period, мы же вроде предыдущими действиями и так это определили?


И в итоге в конце концов какие соотношения частот работы модели (общего тактового генератора), символьной и битовой оказываются?

С плисами пока не работал.
DMax
Цитата(Dub01 @ Dec 10 2008, 21:12) *
Я как раз реализовал синхронизацию во временной области, по средствам автокорреляции циклического префикса. Действительно пики достаточно широкие, но по ним можно с погрешностью +-3 отсчёта засинхронизироваться. Ну а для совсем точной синхронизации можно рассмотреть модельку господина petrov'a, с которой я потихоньку стараюсь разобраться.


Все дело в том, что схема описаная в статье применима только в том случае, когда ты точно знаешь, что в этом месте есть нужные тебе сигнал. Она будет давать мягко говоря странные результаты, если её применить к шуму. А вот чтобы просто обнаружить OFDM нужно использовать другие методы. Это можно делать разными методами, но корреляция в частотной области мне кажестя наиболее эффективной.

Цитата(Dub01 @ Dec 10 2008, 21:12) *
Что касается Вашего предложения синхронизоваться по преамбуле, то тут нужно сказать что не во всех сигналах она присутствует, точно также как и пилот-тон , а циклический префикс используется почти всегда (кстате он специально предназначался не только для борьбы с замираниями в каналах и с МСИ, но и для частотной и временной синхронизации). Хотя не буду спорить, возможно если есть преамбула или пилот, то по ним проще и лучше синхронизироваться. У Вас есть какие-нибудь результаты?


В реализациях OFDM я ещё не встречал сигналов без преамбулы. Все дело в том, что вы не можете засинхронизироваться точнее чем в отсчет. А промах на t, где 0 <= t < 1/Fs, то есть меньше отсчета, приводит к тому, что фаза n-ой поднесущей убегает относительно фазы 1-ой поднесущей на n*delta_w*t , где delta_w - разнос между двумя соседними поднесущими. То есть фаза у самой высокочастотной поднесущей убежит на довольно большую величину вплоть до Pi. А ваше сигнальное созведие превратится в нечто, что я называю "веером". Такие вещи может и должен исправлять эквалайзер, который строится по заранее известному сигналу, т.е. преамбуле.

Что касается статьи - авторы предлагают использовать QPSK манипуляцию для фаз поднесущих. Этот же метод будет работать для BPSK и других фазовых манипуляциях. Однако, например, манипулированный 64-QAM сигнал очень сложно подстраивать, используя такой метод и отказавшись от пилотов. Поэтому и в WiFi и в WiMax они (пилоты) есть. А в IEEE рабоают не дураки (хотя иной раз начинаешь в этом сомниваться).

Результат у меня есть в виде работающего кода приема 802.11g. Коллега делал для меня модель в матлабе, но скажем так, в ней будет трудно разобраться непосвещенному smile.gif
Alex65111
Цитата
Все дело в том, что схема описаная в статье применима только в том случае, когда ты точно знаешь, что в этом месте есть нужные тебе сигнал. Она будет давать мягко говоря странные результаты, если её применить к шуму. А вот чтобы просто обнаружить OFDM нужно использовать другие методы. Это можно делать разными методами, но корреляция в частотной области мне кажестя наиболее эффективной.


Так вроде процессы обнаружения и синхронизации это разные вещи. Разговор идет про синхронизацию, т.е. работа идет не с шумом, а с сигналом.
А чем отличается процесс обнаружения ОФДМ от обычного однотонального сигнала?, и в чем суть корреляции в частотной области?, будет разница для однотонального и ОФДМ?

Цитата
В реализациях OFDM я ещё не встречал сигналов без преамбулы
так вроде у Петрова и без преамбулы и без префикса все получается?
petrov
Цитата(Leshii @ Dec 11 2008, 16:06) *
Не могли бы Вы все таки немного подробнее разъяснить нюансы синхронизации симулинковской модели, а то от всевозможных sample time голова кругом идет.
1. sample time всей модели или задающий такт где определяется и чему равен? Не 1/36 как в модуле unit delay (fmt_modulator)?


Да sample time = 1/36 задаётся в unit delay.

Цитата(Leshii @ Dec 11 2008, 16:06) *
2. С выхода NCO (fmt_modulator) мы получаем 1 импульс на 36 входных тактов?
Почему содержимое выходов sel и underflow идентично? В чем смысл тогда двух выходов, можно же было через один?


Да на 36 тактовых импульсов мы получаем один enable по которому формируется новый символ QPSK во всех поднесущих. Cодержимое выходов sel и underflow не идентично, sel это индекс который используется для мультиплексирования соответствующего отсчёта с выхода синтезирующего банка фильтров(читайте статью которую выше приводил).

Цитата(Leshii @ Dec 11 2008, 16:06) *
3. В блоке baud_clock_domain перед ifft почему используется vert cat, а не буфер?, и в чем смысл добавления 20 нулей?


Поднесущие формируются параллельно 1 раз за 36 отсчётов, это можно сделать и последовательно в реальной реализации, но цель этой модели понимание. Цель 20 нулей в том чтобы полученный сигнал имел передискретизацию например для простоты последующей интерполяции или простоты аналогового фильтра после ЦАПа, можете уменьшить количество нулей и добавить ещё модулированных поднесущих и увидите это на спектрограмме.

Цитата(Leshii @ Dec 11 2008, 16:06) *
4. На выходе polyphase_FIR_filter вместо блоков по 32 отсчета появляются блоки по 36 отсчетов, с чем связано такое преобразование?


С тем что это не критически семплированный банк фильтров в отличие от OFDM, символ длится 36 отсчётов или 1 секунда хотя расстояние между поднесущими 36/32=1,125 Гц, поднесущие раcположены чуть дальше друг от друга чем в случае OFDM и имеют более узкий спектр за счёт сглаживания импульсной характеристикой приподнятого косинуса c коэффициентом ската 36/32-1=0.125, длящейся 16 символов, за счёт этого поднесущие имеют большое подавление за пределами своей полосы в отличие от OFDM, ICI в принципе отсутствует(опять же читайте статью).


Цитата(Leshii @ Dec 11 2008, 16:06) *
5. Что дает блок signal specification с принудительным указанием sample time?, вроде раньше 1/36 уже задавалась?


Это симулинковские заморочки, можете удалить будет просто очень медленно работать, не видит он корректно семпл тайм что-то там нарушается в симуляции, этим блоком принудительно семпл тайм задаётся.



Цитата(Leshii @ Dec 11 2008, 16:06) *
6. В чем суть задания на стороне передатчика задержки на 23 такта модели?


Это сдвиг между начальными фазами символьных генераторов передатчика и приёмника, 23 самый плохой случай когда они на половину символьного интервала сдвинуты, поставьте к примеру 23-36/2=5 и не будет переходного процесса символьной ФАПЧ.


Цитата(Leshii @ Dec 11 2008, 16:06) *
7. В блоке awgn channel зачем опять указывать symbols period, мы же вроде предыдущими действиями и так это определили?


Блок awgn просто прибавляет белый шум, он не знает что вы подразумеваете под сигналом который через него проходит, для того чтобы он прибавил шум соответствующий определённому Eb/N0 ему в том числе нужно знать длительность символа.

Цитата(Leshii @ Dec 11 2008, 16:06) *
И в итоге в конце концов какие соотношения частот работы модели (общего тактового генератора), символьной и битовой оказываются?


Надеюсь что выше ответил на этот вопрос, в любом случае читайте внимательней статью и диссертацию.

Цитата(Alex65111 @ Dec 11 2008, 17:44) *
так вроде у Петрова и без преамбулы и без префикса все получается?


Это не совсем OFDM, родственная модуляция, скорее дальнейшее развитие OFDM, и это не полноценный модем а какая-то часть небольшая. В реальности для больших расстроек тоже может потребоваться преамбула.
alex_os
Цитата(DMax @ Dec 11 2008, 17:00) *
В реализациях OFDM я ещё не встречал сигналов без преамбулы. Все дело в том, что вы не можете засинхронизироваться точнее чем в отсчет. А промах на t, где 0 <= t < 1/Fs, то есть меньше отсчета, приводит к тому, что фаза n-ой поднесущей убегает относительно фазы 1-ой поднесущей на n*delta_w*t , где delta_w - разнос между двумя соседними поднесущими. То есть фаза у самой высокочастотной поднесущей убежит на довольно большую величину вплоть до Pi. А ваше сигнальное созведие превратится в нечто, что я называю "веером". Такие вещи может и должен исправлять эквалайзер, который строится по заранее известному сигналу, т.е. преамбуле.


Вы конечно правы на 100%, но кажется Dub01 делает 39 tones parallel modem (mil-std-188-110b), а там дифференциальная модуляция, так что на прецизионную синхронизацию с точностью до фазы несущей можно забить и использовать простейший дифференциальный демодулятор (который тупо вычисляет разность фазы между последовательными символами) в каждом подканале, естественно будет некоторая потеря помехоустойчивости.
Leshii
petrov


Предположим имеются биты b1,b2…b16. Необходимо их передать на 4х поднесущих при помощи QPSK.
Первый вариант развития событий (рисунок 3 статьи). Формируем пары и отображаем в комплексной плоскости - x1=(b1,b2), x2=(b3,b4), x3=(b5,b6), x4=(b7,b8), x5=(b9,b10), x6=(b11,b12), x7=(b13,b14), x8=(b15,b16). Формируем последовательность столбцов – (x1 x2 x3 x4), (x5 x6 x7 x8), каждую строчку множим на комплексную экспоненту своей частоты, первую на f1, вторую на f2, третью на f3, четвертую на f4.
В итоге в момент времени t1 на выходе будет
x1*exp(2*pi*f1*t1)+ x2*exp(2*pi*f2*t1)+ x3*exp(2*pi*f3*t1)+ x4*exp(2*pi*f4*t1),
в момент времени t2 будет
x5*exp(2*pi*f1*t2)+ x6*exp(2*pi*f2*t2)+ x7*exp(2*pi*f3*t2)+ x8*exp(2*pi*f4*t2).

Второй вариант развития событий (рисунок 4 статьи). Все то же самое до процесса умножения на комплексные экспоненты, т.е. также формируем x1,x2,…,x8, а затем подаем их на idft, а затем из параллельного выхода разворачиваем их в последовательный выход.
Если расскрыть процесс idft, то вроде получается следующее
Для передачи столбца (x1 x2 x3 x4)
Y1=x1*exp(2*pi*f1*t1’)+ x2*exp(2*pi*f1*t1’’)+ x3*exp(2*pi*f1*t1’’’)+ x4*exp(2*pi*f1*t1’’’’)
Y2=x1*exp(2*pi*f2*t1’)+ x2*exp(2*pi*f2*t1’’)+ x3*exp(2*pi*f2*t1’’’)+ x4*exp(2*pi*f2*t1’’’’)
Y3=x1*exp(2*pi*f3*t1’)+ x2*exp(2*pi*f3*t1’’)+ x3*exp(2*pi*f3*t1’’’)+ x4*exp(2*pi*f3*t1’’’’)
Y4=x1*exp(2*pi*f4*t1’)+ x2*exp(2*pi*f4*t1’’)+ x3*exp(2*pi*f4*t1’’’)+ x4*exp(2*pi*f4*t1’’’’)
И когда развернем получится Y1 Y2 Y3 Y4, и далее для передачи другого столбца (x5 x6 x7 x8) получится Y5 Y6 Y7 Y8.

В итоге по первому варианту требуется два момента времени (два символа), а по варианту idft 8 моментов времени(символов) да и вообще слабо просматривается идентичность выходов, хотя вроде бы должна быть.

Где я ошибся?
petrov
Цитата(Leshii @ Dec 12 2008, 12:12) *
...


Попозже если время будет попробую расписать.
petrov
Код
Пусть w=e^(j*2*pi/N)

Например возьмём N=4.
    _               _
   | w^0 w^0 w^0 w^0 |
W= | w^0 w^1 w^2 w^3 |
   | w^0 w^2 w^4 w^6 |
   |_w^0 w^3 w^6 w^9_|
  
X=[x3 x2 x1 x0]' ('- транспонирование)

Обратное дискретное преобразование фурье от X
(масштабирующий коэффициент не рассматриваем):

iDFT(X)=W*X

Последовательности символов в каждой поднесущей:

a0,a1,a2...
b0,b1,b2...
c0,c1,c2...
d0,d1,d2...

Импульсная характеристика сглаживающего фильтра,
например пусть 5 отсчётов на символ, длительность в 3 символа:

h0,h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13,h14

Полифазная декомпозиция фильтра:

   _         _
  | h0 h5 h10 |
  | h1 h6 h11 |
H=| h2 h7 h12 |
  | h3 h8 h13 |
  |_h4 h9 h14_|
  
A,B,C,D - векторы столбцы выходы линий задержек с отводами сглаживающих фильтров.

Например:

А0=[0,0,0]'
A1=[a0,0,0]'
A2=[a1,a0,0]'
A3=[a2,a1,a0]'
...

Векторы столбцы выходы чётырёх полифазных фильтров:

H*A,H*B,H*C,H*D

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

Выход, вектор столбец, сумма 4-х каналов(.* - поэлементное умножение):
            _   _         _   _         _   _         _   _
OUT1=H*A1.*| w^0 |+H*B1.*| w^0 |+H*С1.*| w^0 |+H*D1.*| w^0 |
           | w^0 |       | w^1 |       | w^2 |       | w^3 |
           | w^0 |       | w^2 |       | w^4 |       | w^6 |
           | w^0 |       | w^3 |       | w^6 |       | w^9 |
           |_w^0_|       |_w^0_|       |_w^0_|       |_w^0_|
            _   _         _   _         _   _         _   _
OUT2=H*A2.*| w^0 |+H*B2.*| w^1 |+H*С2.*| w^2 |+H*D2.*| w^3 |
           | w^0 |       | w^2 |       | w^4 |       | w^6 |
           | w^0 |       | w^3 |       | w^6 |       | w^9 |
           | w^0 |       | w^0 |       | w^0 |       | w^0 |
           |_w^0_|       |_w^1_|       |_w^2_|       |_w^3_|
            _   _         _   _         _   _         _   _
OUT3=H*A3.*| w^0 |+H*B3.*| w^2 |+H*С3.*| w^4 |+H*D3.*| w^6 |
           | w^0 |       | w^3 |       | w^6 |       | w^9 |
           | w^0 |       | w^0 |       | w^0 |       | w^0 |
           | w^0 |       | w^1 |       | w^2 |       | w^3 |
           |_w^0_|       |_w^2_|       |_w^4_|       |_w^6_|
...

Мультиплексируя выход вектора столбца OUT в 5 раз чаще символьной частоты
получим модуляцию FMT в "лоб".

Раскроем OUT1:
      _                                           _
OUT1=| h0*(a0*w^0+b1*w^0+c0*w^0+d0*w^0)+h5*0+h10*0 |
     | h1*(a0*w^0+b1*w^1+c0*w^2+d0*w^3)+h6*0+h11*0 |
     | h2*(a0*w^0+b1*w^2+c0*w^4+d0*w^6)+h7*0+h12*0 |
     | h3*(a0*w^0+b1*w^3+c0*w^6+d0*w^9)+h8*0+h13*0 |
     |_h4*(a0*w^0+b1*w^0+c0*w^0+d0*w^0)+h9*0+h14*0_|

Обозначим F=iDFT([a,b,c,d]')

F1=iDFT([a0,b0,c0,d0]')
F2=iDFT([a1,b1,c1,d1]')
F3=iDFT([a2,b2,c2,d2]')
...

      _                   _
OUT1=| h0*F1(1)+h5*0+h10*0 |
     | h1*F1(2)+h6*0+h11*0 |
     | h2*F1(3)+h7*0+h12*0 |
     | h3*F1(4)+h8*0+h13*0 |
     |_h4*F1(1)+h9*0+h14*0_|
      _                       _
OUT2=| h0*F2(2)+h5*F1(2)+h10*0 |
     | h1*F2(3)+h6*F1(3)+h11*0 |
     | h2*F2(4)+h7*F1(4)+h12*0 |
     | h3*F2(1)+h8*F1(1)+h13*0 |
     |_h4*F2(2)+h9*F1(2)+h14*0_|
      _                           _
OUT3=| h0*F3(3)+h5*F2(3)+h10*F1(3) |
     | h1*F3(4)+h6*F2(4)+h11*F1(4) |
     | h2*F3(1)+h7*F2(1)+h12*F1(1) |
     | h3*F3(2)+h8*F2(2)+h13*F1(2) |
     |_h4*F3(3)+h9*F2(3)+h14*F1(3)_|
...

FF1=[F1 0 0]
FF2=[F2 F1 0]
FF3=[F3 F2 F1]
...

FF - линия задержки с отводами векторами столбцами, матрица 4x3.

OUT1=sum(H.*[FF1(1,:); FF1(2,:); FF1(3,:); FF1(4,:); FF1(1,:)])'
([FF1(1,:); FF1(2,:); FF1(3,:); FF1(4,:); FF1(1,:)] - склейка рядов в матрицу 5x3;
sum() - сумма элементов каждого ряда матрицы, в итоге получаем вектор строку из матрицы)

OUT2=sum(H.*[FF2(2,:); FF2(3,:); FF2(4,:); FF2(1,:); FF2(2,:)])'
OUT3=sum(H.*[FF3(3,:); FF3(4,:); FF3(1,:); FF3(2,:); FF3(3,:)])'
OUT4=sum(H.*[FF4(4,:); FF4(1,:); FF4(2,:); FF4(3,:); FF4(4,:)])'
...

В результате получаем быстрый алгоритм где вместо комплексного гетеродина
на каждую поднесущую имеем быстрое блочное FFT на все поднесущие,
вычисляемое на символьной частоте, вместо полифазного фильтра на каждую
поднесущую имеем один полифазный фильтр на все поднесущие, работающий на
символьной частоте.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.