|
BPSK(QPSK) модулятор-демодулятор и гидроакустический модем |
|
|
|
 |
Ответов
|
Feb 5 2018, 12:24
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE Возможно, что если тот код для 1200бод переложить на ассемблер современного Cortex-M примерно на 200МГц, то он вытянул-бы. biggrin.gif Не хочу Вас расстраивать, но делал я как-то как раз гидроакустический модем, там была OFDM, скорость данных порядка 140кбит/с, полный дуплекс с несущими 500кГц и 1МГц (аплинк и даунлинк соответственно). Ну справедливости ради там перемножители были внешние. И внешний АЦП (банальный аудио-АЦП двухканальный), цифровать квадратуры уже после смесителя. Работало это на 100МГц Cortex-M3 без особых проблем, без всякой плавающей точки, с загрузкой проца где-то в 30-40 процентов. Да-да, с Фурье вперед и назад, с эквалайзером и прочими необходимыми для OFDM пирогами. А еще был другой, там именно GMSK был, на канале управления жил. Тоже, правда, с внешним АЦП, прямо цинично пьезокерамика на дифференциальный вход AK5384 была подключена. И несущая как раз была в районе 40кГц. Цифровал себе спокойно всю полосу, и дальше все по классике. Ну совсем же смешное было CODE #define F_CPU (100000000ULL) #define RXLS_SAMPLE_RATE (97655ULL) #pragma inline=forced static long long QMULL(REG32 a, REG32 b, REG32 c, REG32 d) { long long r; asm("SMULL %L0,%H0,%1,%2":"=Rp"®:"r"(a),"r"(  ); asm("SMLAL %L0,%H0,%1,%2":"+Rp"®:"r"©,"r"(d)); //return ((long long)a *  + ((long long)c * d); return r; } static long long FMULADD64(long long r, long long a, UREG32 k) { asm("SMLAL %L0,%H0,%H1,%2":"+Rp"®:"Rp"(a),"r"(k)); asm("UMULL %L0,%H0,%L0,%1":"+Rp"(a):"r"(k)); a+=0x80000000; asm("ADDS %L0,%L0,%H1":"+Rp"®:"r"(a):"cc"); asm("ADC %H0,%H0,#0":"+Rp"®); return r; } static long long FMULSUB64(long long r, long long a, UREG32 k) { asm("SMLAL %L0,%H0,%H1,%2":"+Rp"®:"Rp"(a),"r"(-k)); asm("UMULL %L0,%H0,%L0,%1":"+Rp"(a):"r"(k)); a+=0x80000000; asm("SUBS %L0,%L0,%H1":"+Rp"®:"r"(a):"cc"); asm("SBC %H0,%H0,#0":"+Rp"®); return r; } #pragma inline=forced static inline REG32 EXPDIVfast(long long f, unsigned long long a) { UREG ea; UREG32 a32=a>>32; REG32 f32=f>>32; if (a32) { ea=__CLZ(a32); a32=(a32<<ea)|((unsigned long)a>>(32-ea)); ea--; f32=(f32<<ea)|((unsigned long)f>>(32-ea)); } else { a32=a; f32=f; ea=__CLZ(a32); a32=a32<<ea; ea--; f32=f32<<ea; } a32>>=16+1; if (a32) return (f32/(REG32)a32)<<8; else return 0; } #define DEFAULT_FREQ_HZ (32010ULL) #define DEFAULT_FREQ ((DEFAULT_FREQ_HZ<<32)/RXLS_SAMPLE_RATE) UINT32 freq_a=DEFAULT_FREQ; UINT32 phase_a; #define CHLPF_SHIFT (27) #define CHLPF_PREGAIN_SHIFT (27) //1.5kHz, 1dB, 5 poles, Z-transform #define CHLPF_K0 ( 961) #define CHLPF_K1 ( 98213853) #define CHLPF_K2 ( 521724849) #define CHLPF_K3 ( 1109599598) #define CHLPF_K4 ( 1181066974) #define CHLPF_K5 ( 629195138) void I2S_IRQHandler(void) { REG32 rxsig; rxsig=I2SRXFIFO; REG32 I; REG32 Q; UREG32 vo=phase_a; I=rxsig*SIN8[(vo+0x00000000)>>24]; Q=rxsig*SIN8[(vo+0x40000000)>>24]; phase_a=vo+freq_a; //Filter I { static signed long long y1,y2,y3,y4,y5; signed long long result; result=(long long)I*CHLPF_K0; result=FMULADD64(result, y1,CHLPF_K1); result=FMULSUB64(result,y1=y2,CHLPF_K2); result=FMULADD64(result,y2=y3,CHLPF_K3); result=FMULSUB64(result,y3=y4,CHLPF_K4); result=FMULADD64(result,y4=y5,CHLPF_K5); y5=result<<(32-CHLPF_SHIFT); I=(INT32)(result>>(CHLPF_SHIFT-1)); } //Filter Q { static signed long long y1,y2,y3,y4,y5; signed long long result; result=(long long)Q*CHLPF_K0; result=FMULADD64(result, y1,CHLPF_K1); result=FMULSUB64(result,y1=y2,CHLPF_K2); result=FMULADD64(result,y2=y3,CHLPF_K3); result=FMULSUB64(result,y3=y4,CHLPF_K4); result=FMULADD64(result,y4=y5,CHLPF_K5); y5=result<<(32-CHLPF_SHIFT); Q=(INT32)(result>>(CHLPF_SHIFT-1)); //Без одного защитного бита } //Demodulation { static INT32 I1,Q1; REG32 id,qd; id=I-I1; I1=I; qd=Q-Q1; Q1=Q; long long f=QMULL(-I,qd,Q,id); unsigned long long a=QMULL(I,I,Q,Q); lsrx_lvl_a=a; //Qdata=-EXPDIVfast(f,a); Qdata=f>0?-0x200000:0x200000; } ... все, тут уже разбор чисто с цифровым потоком, 0/1 это Qdata<0 или >0 } QUOTE Передатчик лучше ЦАП-ом. Нафиг он там не нужен. Делаются таблички для для плавного по Гауссу изменения фазы ШИМ в вариантах переходов бит 0->1 и 1->0 и все. QUOTE И 12 бит разрядности АЦП (которая обычно бывает в МК) может не хватить для обеспечения динамического диапазона и чувствительности. Для такого АЦП да, АРУ надо делать.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Feb 5 2018, 12:40
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Rst7 @ Feb 5 2018, 14:24)  Работало это на 100МГц Cortex-M3 без особых проблем, без всякой плавающей точки, с загрузкой проца где-то в 30-40 процентов. Да-да, с Фурье вперед и назад, с эквалайзером и прочими необходимыми для OFDM пирогами. Дьявол как всегда кроется в деталях. Такую загрузку у меня вызывала конечно не сама демодуляция - это были сущие пустяки. Основная нагрузка была - входные фильтры и битовый детектор (выделение битов из потока сэмплов). Да и по фильтрам и эквалайзерам - думаю не стоит Вам говорить, что даже небольшое ужесточение требований к крутизне АЧХ фильтра приводит к очень большому увеличению длин фильтров. Я потом на этом же самом МК делал другой модем с частотой сэмплирования кодека на порядок выше, но с гораздо более чистым каналом (модем для фидеров 0.4-10кВ) и получил загрузку CPU всего в несколько процентов насколько помню. Да и 30% - это было на максимуме - на pi/4 nQPSK непрерывным потоком на приём и передачу. На 9600бод в полосе 7100Гц. Если бы расширить допустимую полосу сигнала раза в два, то загрузка там падает в разы. Цитата(Rst7 @ Feb 5 2018, 14:24)  asm("SMULL %L0,%H0,%1,%2":"=Rp"®:"r"(a),"r"(  ); asm("SMLAL %L0,%H0,%1,%2":"+Rp"®:"r"©,"r"(d)); Что такое и как работают SMLAL и SMULL и прочие команды Cortex-M - я прекрасно знаю. Писал и оптимизировал работу MP3-декодера с отдельными функциями на чистом асм на Cortex-M. Не напугаете Цитата(Rst7 @ Feb 5 2018, 14:24)  Нафиг он там не нужен. Делаются таблички для для плавного по Гауссу изменения фазы ШИМ в вариантах переходов бит 0->1 и 1->0 и все. Конечно наверное можно обойтись. Но зачем? Зачем таблички и более сложные фильтры после ШИМ, если как правило почти в любом приличном МК Cortex-M есть ЦАП?
|
|
|
|
|
Feb 5 2018, 13:22
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Acvarif @ Feb 5 2018, 15:09)  1. Если представить, что гидроакустические передатчики находясь на некотором расстоянии друг от друга передают (излучают) пакеты разных данных одновременно на одной несущей, то в каких-то точках водной среды пакеты могут перекрываться или налагаться друг на друга. Как в этом случае разделить или идентифицировать нужный пакет от нужного передатчика? Например: организовать работу так, чтобы в каждый момент времени работал только один передатчик (не было коллизий). Например - один центр-мастер, остальные - слэйвы. Мастер организует обмен в канале, слэйвы по своей инициативе не выходят на связь. Цитата(Acvarif @ Feb 5 2018, 15:09)  Как в таком случае, для приемника, определить правильную частоту выборок (семплирования)? Неужели по Найквисту? Лучше - с запасом. Читайте теорию, прочитаете - поймёте  PS: У Вас вопросы совсем по разным уровням и частям. И сам модем и организация обмена в канале - рановато вам ещё этой темой заниматься. Прочитать придётся очень много.
|
|
|
|
|
Feb 6 2018, 06:30
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(jcxz @ Feb 5 2018, 17:22)  PS: У Вас вопросы совсем по разным уровням и частям. И сам модем и организация обмена в канале - рановато вам ещё этой темой заниматься. Прочитать придётся очень много.  Вы правы. Не знаю с какой стороны к этому делу подступиться. Чем больше информации, даже общего плана, тем больше возникает вопросов. В тупик поставил еще один вопрос: Как можно увеличить битовую скорость с 1200, например до 9600, 19200 не меняя длительность посылки? Читал что для этого применяются сложные виды модуляции (QPSK, 8PSK, OFDM). Грустно стало после того как прочитал про OFDM... Нет-ли готовых микросхем модуляторов-демодуляторов способных работать с несущими порядка 35..200 кГц?
Сообщение отредактировал Acvarif - Feb 6 2018, 08:12
|
|
|
|
|
Feb 15 2018, 08:42
|

Профессионал
    
Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143

|
Цитата(Acvarif @ Feb 6 2018, 10:30)  Нет-ли готовых микросхем модуляторов-демодуляторов способных работать с несущими порядка 35..200 кГц? гляньте на HART модем AD5700 или Power Line Communication Modems CY8CPLC10, CY8CPLC20, LM1893, MAX2990, MAX2992, MAX79356, NCN49597-D, NCN49599-D, ST7536, ST7540, ST7580, ST7590, TDA5051A может что и можно под вашу задачу заточить ( тоже изучаю вопрос по смежной тематике ) Цитата(Acvarif @ Feb 2 2018, 10:47)  Как примерно будет выглядеть структура такого устройства? пишут что так
Цитата(Acvarif @ Feb 5 2018, 17:09)  Я действительно далек от темы. Придется штудировать буквари. по этой ссылке знатоки рекомендуют почитать Скляра.
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
Сообщений в этой теме
Acvarif BPSK(QPSK) модулятор-демодулятор и гидроакустический модем Feb 2 2018, 06:47 Rst7 Тут подробности нужны. А то многое зависит от глуб... Feb 2 2018, 09:32 Acvarif Цитата(Rst7 @ Feb 2 2018, 12:32) Тут подр... Feb 5 2018, 08:26  jcxz Цитата(Acvarif @ Feb 5 2018, 10:26) Если ... Feb 5 2018, 11:58 jcxz Цитата(Rst7 @ Feb 2 2018, 11:32) Передатч... Feb 5 2018, 12:08 litv вот такой продается http://rfdsp.ru/modem_ga.html Feb 2 2018, 10:21 Rst7 QUOTE Как примерно будет выглядеть структурная схе... Feb 5 2018, 12:04     jcxz Цитата(Acvarif @ Feb 6 2018, 08:30) Нет-л... Feb 6 2018, 14:17 SemperAnte Цитата(Rst7 @ Feb 5 2018, 15:24) Не хочу ... Feb 13 2018, 07:58 petrov Цитата(Rst7 @ Feb 5 2018, 15:24) полный д... Feb 13 2018, 12:50  jcxz Цитата(petrov @ Feb 13 2018, 14:50) А как... Feb 13 2018, 13:11   SemperAnte Цитата(jcxz @ Feb 13 2018, 16:11) А что м... Feb 13 2018, 13:24    jcxz Цитата(SemperAnte @ Feb 13 2018, 15:24) Я... Feb 13 2018, 14:24     SemperAnte Цитата(jcxz @ Feb 13 2018, 17:24) А где т... Feb 14 2018, 07:37 Rst7 QUOTE Конечно наверное можно обойтись. Но зачем?
... Feb 5 2018, 12:47 jcxz Цитата(Rst7 @ Feb 5 2018, 14:47) А зачем ... Feb 5 2018, 13:01 Kluwert Если канал распространения глубоководный, то (если... Feb 12 2018, 09:21 Rst7 QUOTE Какую дальность обеспечивал модем?
На таких... Feb 13 2018, 11:30 SemperAnte Так вы компанию baltrobotics представляете?
Это он... Feb 13 2018, 11:44 Rst7 QUOTE Так вы компанию baltrobotics представляете?
... Feb 13 2018, 12:09 Rst7 QUOTE А как развязка передатчика и приёмника осуще... Feb 13 2018, 12:59 bve Возьмите и присвойте какому-либо набору частот циф... Feb 14 2018, 20:55 Acvarif Цитата(bve @ Feb 14 2018, 23:55) Возьмите... Feb 15 2018, 19:49 Rst7 QUOTE А если вообще по самому минимому то минималь... Feb 15 2018, 20:02 Acvarif Цитата(Rst7 @ Feb 15 2018, 23:02) Эээ, Вы... Feb 16 2018, 20:20  Acvarif Подскажите пожалуйста где можно найти исходники дл... Feb 18 2018, 18:29   megajohn Цитата(Acvarif @ Feb 18 2018, 21:29) Подс... Feb 19 2018, 07:21    Acvarif Цитата(megajohn @ Feb 19 2018, 10:21) ну ... Feb 28 2018, 17:20     Grizzzly Цитата(Acvarif @ Feb 28 2018, 20:20) Спас... Feb 28 2018, 18:09      Acvarif Цитата(Grizzzly @ Feb 28 2018, 21:09) Это... Mar 8 2018, 15:17       Grizzzly Цитата(Acvarif @ Mar 8 2018, 18:17) 1. В ... Mar 8 2018, 17:52       petrov Цитата(Acvarif @ Mar 8 2018, 18:17) Читая... Mar 8 2018, 18:38        Acvarif Цитата(petrov @ Mar 8 2018, 21:38) Статья... Mar 8 2018, 19:59         petrov Цитата(Acvarif @ Mar 8 2018, 22:59) как в... Mar 8 2018, 21:14          Acvarif Цитата(petrov @ Mar 9 2018, 00:14) Надо и... Mar 9 2018, 08:02 Grizzzly Я бы, как посоветовал petrov, в вашем случае осуще... Mar 9 2018, 10:04 Acvarif Цитата(Grizzzly @ Mar 9 2018, 13:04) Я бы... Mar 9 2018, 10:13  Grizzzly Цитата(Acvarif @ Mar 9 2018, 13:13) Где м... Mar 9 2018, 11:47   Acvarif Цитата(Grizzzly @ Mar 9 2018, 15:47) Neza... Mar 9 2018, 18:14 Grizzzly Схема Костаса должна работать с непрерывным потоко... Mar 9 2018, 18:30 Acvarif Цитата(Grizzzly @ Mar 9 2018, 22:30) Схем... Mar 9 2018, 19:01  quato_a Цитата(Acvarif @ Mar 9 2018, 22:01) Спаси... Mar 13 2018, 10:11   petrov Цитата(quato_a @ Mar 13 2018, 13:11) Да, ... Mar 13 2018, 11:26    quato_a Цитата(petrov @ Mar 13 2018, 14:26) А есл... Mar 14 2018, 17:29     petrov Цитата(quato_a @ Mar 14 2018, 20:29) Дела... Mar 14 2018, 18:05      quato_a Цитата(petrov @ Mar 14 2018, 21:05) Делал... Mar 15 2018, 06:09       petrov Цитата(quato_a @ Mar 15 2018, 09:09) Это ... Mar 15 2018, 10:07        quato_a Цитата(petrov @ Mar 15 2018, 13:07) Всё с... Mar 16 2018, 12:04        Rst7 QUOTE (petrov @ Mar 15 2018, 12:07) сразу... Mar 16 2018, 12:37         petrov Цитата(Rst7 @ Mar 16 2018, 15:37) А можно... Mar 16 2018, 13:44          Rst7 QUOTE (petrov @ Mar 16 2018, 15:44) preco... Mar 16 2018, 13:55           petrov Цитата(Rst7 @ Mar 16 2018, 16:55) А есть ... Mar 16 2018, 14:34 qxov Банк согласованных с преамбулой для различных вели... Mar 12 2018, 05:12
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|