* * * Форум CQHAM.RU Тема * * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Тема : Цифровой портативный приемник на ПЛИС "Сирена" Started at 14.08.2016 22:07 by rolin Visit at http://www.cqham.ru/forum/showthread.php?t=33780 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 1] Автор : rolin Дата : 14.08.2016 22:07 Заголовок : Цифровой портативный приемник на ПЛИС "Сирена" Всем привет. Представляю вашему вниманию очередную разработку, которая представляет собой попытку сделать цифровой приемник на одной микросхеме. Конечно, не только ПЛИС нужна для реализации приемника, еще нужен АЦП для прямой оцифровки эфира, и ЦАП для вывода звука, но по большому счету вся обработка происходит в единственной микросхеме ПЛИС. В качестве оной выбран Cyclone 5 , производящийся по технологии 18 нм и соответственно обладающий низким энергопотреблением. Насчет автономности все же особых рекордов ожидать не стоит, но благодаря современным емким Li-On аккумуляторам думаю эта проблема будет решена. Приемник планируется использовать с аккумуляторами типа 18650. Это дешевые и очень распространенные аккумуляторы с большой емкостью до 3000 мА*ч. Ожидается, что автономная работа от одного такого аккумулятора составит около 5 часов, причем аккумуляторы можно будет менять как обычные батарейки. 240510 240511 240512 Первая версия платы воплощена в железе, обнаружено достаточное количество ошибок, которые планируется исправить в следующей итерации, а заодно изменить кое-что в конфигурации. Плата позволяет использовать большой 2.5 дюйма OLED дисплей, с разрешением 128*64 либо маленький 1 дюймовый + динамик на передней панели. При этом никаких изменений в прошивке делать не нужно, так как дисплеи идентичны. Версия с маленьким дисплеем смотрится достаточно убого, но как сделать качественный звук одновременно с большим дисплеем я еще не придумал. Версию с 2.5 дюймовым дисплеем можно будет слушать на наушники, либо подключать к внешним колонкам с собственным аккумулятором. Блок-схема устройства представлена на рисунке: 240516 Основной стабилизатор питания MCP79410, заряд аккумулятора током до 1А осуществляется MCP73871, датчики тока заряда и разряда на MAX44284 позволяют процессору иметь полную информацию о жизни аккумулятора. Микропроцессор PIC16F1788 управляет питанием и реализует интерфейс пользователя. На плате имеется также микросхема часов реального времени с ионистором, но в следующей версии планируется убрать ее, так как роль RTC может спокойно выполнять и сам микропроцессор. В этом случае придется сменить тип ионистора на другой с рабочим напряжением 5 вольт либо просто запаять крупный конденсатор. Оптический енкодер HRPG-ASCA-16F - невероятно качественная вещь, но к сожалению дорогая и по размерам выходит за общие рамки, поэтому стоит подыскать ему замену. Интерфейс USB не только позволяет использовать кабеля и зарядники от мобильных телефонов, но и работать приемнику в качестве SDR совместно с такими программами как HDSDR, QUISK, SDR-Console. Приемник эмулирует протокол SDR-IQ и позволяет работать с шириной панорамы до 200 кГц. Проект будет полностью открытый. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 2] Автор : US7IGN Дата : 14.08.2016 22:18 какая цена вопроса планируется? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 3] Автор : rolin Дата : 14.08.2016 22:21 Внимание, проект на начальном этапе разработки. Прошу пока не писать мне просьбы предоставить печатные платы, так как имеющиеся содержат серьезные ошибки. В настоящий момент реализована только первая ступень обработки, получены широкополосные IQ каналы. Также реализован интерфейс на компьютер и приемник работает как SDR. Из-за некоторых проблем с эмуляцией протокола пока что только с QUISK и с HDSDR (нестабильно). Теперь можно писать вторую ступень, DSP обработку. Опыта в проектировании нет, прошу помогать кто чем может. После написания ДСП, можно будет заняться интерфейсом пользователя. В настоящий момент процессор выводит служебную информацию на дисплей, то есть начало положено. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 4] Автор : RW3QCF Дата : 14.08.2016 22:22 Каков диапазон принимаемых частот? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 5] Автор : rolin Дата : 14.08.2016 22:33 какая цена вопроса планируется? До производства слишком далеко еще, но по запчастям я думаю не больше 130 долл будет Каков диапазон принимаемых частот? 0-30МГц -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 6] Автор : labuda51 Дата : 14.08.2016 22:38 Rolin.Дисплей что будет показывать?. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 7] Автор : rolin Дата : 14.08.2016 22:48 Насчет ДСП - планирую работать с частотой 55 кГц, каждый квадратурный канал пропустить через фильтр 240518 После чего один из каналов нужно повернуть на 90 град с помощью фильтра Гильберта, либо коэффициенты ФОС должны быть подобраны так, чтобы сдвиг между каналами был 90 град. Потом можно складывать либо отнимать значения каналов для получения SSB декодинга. Я правильно размышляю ? Добавлено через 7 минут(ы): Дисплей что будет показывать? Нижняя половина дисплея будет показывать панораму, не слишком широко конечно, но достаточно для точной и быстрой настройки на станцию. Верхняя половина частоту, часы, заряд аккумулятора и т.д. В общем интерфейс давно продуман, сейчас главное ДСП сделать. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 8] Автор : labuda51 Дата : 14.08.2016 23:24 Rolin.Немного в сторону.Интересует 8 бит,до 29.7,без УВЧ под HDSDR.Какие АЦП и FPGA по миниму(цена) справятся?. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 9] Автор : rolin Дата : 15.08.2016 00:05 Интересует 8 бит,до 29.7,без УВЧ под HDSDR.Какие АЦП и FPGA по миниму(цена) справятся? Посмотрите на этот проект (https://habrahabr.ru/post/204310/) . При желании, код можно портировать на любую дешевую китайскую демоборду, например на EP3C5, но будет впритык. Лучше EP3C10. Насчет ДСП, преобразование Гильберта та еще гадость, поэтому думаю по такому методу реализовать декодирование SSB 240519 По данным схемы, полоса 15 кГц - это максимальная возможная полоса для приемника, достаточная и для АМ и для ЧМ. Если нужна узкая полоса, то фильтры сужаются а генераторы синуса и косинуса всегда работают на 15 кГц. Это правильно ? Или так ? 240524 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 10] Автор : Alex-31 Дата : 15.08.2016 06:22 для АМ и для ЧМ раз уз это приёмник, то хотелось бы ещё и DRM демодулятор, имхо... -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 11] Автор : SVd2004 Дата : 15.08.2016 07:28 Первая версия платы воплощена в железе Мне кажется,конструкцию нужно делать вертикальной, будет удобней. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 12] Автор : labuda51 Дата : 15.08.2016 08:39 Rolin.Скрестите две отладочные платы- ADC и FPGA.8 бит до 30 Мгц и будут продажи.Если бы свисток принимал до 30 Мгц не был таким секретным то вообще что-то ещё продавалось. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 13] Автор : Alex-31 Дата : 15.08.2016 09:11 8 бит а не маловато будет? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 14] Автор : labuda51 Дата : 15.08.2016 09:51 Наука гласит-2-4-8-16.8 бит ругают 12 обходят стороной и только жаркие споры между 14 и 16.8 или 16-по деньгам то есть по желанию заказчика-по мере надобности в применении. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 15] Автор : Alex-31 Дата : 15.08.2016 09:59 8 бит АЦП обеспечат ДД около 50 дБ 10 бит - около 60 дБ 12 бит - около 70 дБ 14 бит - около 80 дБ 16 бит - около 90 дБ для портативного приёмничка да с аккумулятором, который, как я понимаю, имеется желание таскать с собой по по пляжам и шашлыкам, разрядности АЦП достаточно и 12 бит... -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 16] Автор : US8IDZ Дата : 15.08.2016 10:06 Мне кажется,конструкцию нужно делать вертикальной, будет удобней. если не привязывать намертво к плате дисплей, валкодер, динамик и т.д., как это сделано с пришитым одним уродливым ухом с валкодерами и кнопками у контроллера VisAir, то можно будет выбирать любую ориентацию, в смысле пространственной :oops: P.S. Наверное обпечатка "Li-On аккумуляторы"? Вроде должно быть Li-Ion, хотя лучше бы LiFePO4, которые безопаснее и имеют гораздо большее количество циклов заряд-разряд (раз в 10-ть), срок службы более 10 лет, и рабочую температуру от -30 до +70 градусов Цельсия, что немаловажно для переносного девайса на природе, скажем на рыбалке свои Li-Ion аккумуляторы на фонарике и фотокамере убил на 20-ти градусном морозе. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 17] Автор : labuda51 Дата : 15.08.2016 10:11 Только RTL2832 в HDSDR показывает на панораме собственные 28.8-63дБ-проверьте или поверьте.Реально при приёме-S9+20.Но она с недостатками не дотягивает без фильтра до 30. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 18] Автор : Alex-31 Дата : 15.08.2016 10:20 US8IDZ, конечно! не нужно делать всё на одной плате - это здорово ограничивает варианты конструкционного решения... -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 19] Автор : rolin Дата : 15.08.2016 13:18 не нужно делать всё на одной плате - это здорово ограничивает варианты конструкционного решения... А кто мешает расположить плату вертикально вместе с дисплеем, поместив в соответствующий корпус ? Если очень хочется, конечно. Потому, что вертикальный корпус будет занимать больший обьем. А мне вот нравится такой корпус http://www.hammondmfg.com/jpeg/R250_ExB.jpg -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 20] Автор : Alex-31 Дата : 15.08.2016 14:01 rolin, чем больше уровень интеграции - тем меньше возможностей для дизайна в данном случае крайне сузится перечень пригодных корпусов для монтирования в них приёмничка... а так решение мне нравиться - стильно :пиво: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 21] Автор : rolin Дата : 15.08.2016 14:33 Это готовый корпус от Hammond, который можно купить в любой момент. Для плат, которые есть сейчас, можно заказать акриловые пластины и будеи прозрачный корпус как обычно в демобордах делают. Но наиболее художественно было бы печатать корпус на 3Д принтере, тогда можно сделать не хуже чем заводской. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 22] Автор : SVd2004 Дата : 15.08.2016 15:06 А мне вот нравится такой корпус Вообще то нужна телескопическая антенна, и не коротышка. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 23] Автор : US8IDZ Дата : 15.08.2016 19:02 ...не нужно делать всё на одной плате - это здорово ограничивает варианты конструкционного решения... У VisAir уже ампутировали то ухо http://www.cqham.ru/forum/showthread.php?28975-%CA%EE%ED%F2%F0%EE%EB%EB%E5%F0-SDR-%F2%F0%E0%ED%F1%E8%E2%E5%F0%E0-%D2%FE%EB%FC%EF%E0%ED&p=1290718&viewfull=1#post1290718 Видать именно по этой причине Вообще то нужна телескопическая антенна, и не коротышка. полноразмерная, карманная для сверхдальнего приема:super: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 24] Автор : rolin Дата : 15.08.2016 19:22 Вообще то нужна телескопическая антенна, и не коротышка Пожалуйста (http://ru.aliexpress.com/item/NEW-TV-antenna-SMA-antenna-Telescopic-antenna-Portable-Radio-Scanner-VHF-UHF/32648148923.html?spm=2114.03010208.3.11.YzXusu&ws_ab_test=searchweb201556_0,searchweb201602_5_10039_10057_10056_10055_10037_10049_301_10033_10059_10032_10058_10017_10060_10061_10062_10064,searchweb201603_1&btsid=fc5c9387-8900-4b9e-baf1-5716998682a8), можно и метровую найти. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 25] Автор : SVd2004 Дата : 15.08.2016 19:46 можно и метровую найти. Нормально, только её нужно в корпус спрятать. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 26] Автор : UR5ZQV Дата : 15.08.2016 20:32 rolin, Насчет ДСП, преобразование Гильберта та еще гадость, поэтому думаю по такому методу реализовать декодирование SSB http://www.cqham.ru/forum/attachment.php?attachmentid=240519&d=1471208451&thumb=1 (http://www.cqham.ru/forum/attachment.php?attachmentid=240519&d=1471208451) По данным схемы, полоса 15 кГц - это максимальная возможная полоса для приемника, достаточная и для АМ и для ЧМ. Если нужна узкая полоса, то фильтры сужаются а генераторы синуса и косинуса всегда работают на 15 кГц. Наверное, после IQ перемножения лучше сумматор применить (а не перемножитель), в смысле арифметики. 15 кГц для WFM (тем более для стерео) наверное маловато будет. Перекладывать на быстродействующую ПЛИС обработку по НЧ наверное накладненько будет (можно только ВЧ перемножение, децимация и минимальная фильтрация, остальное чем нибудь по проще), но Вам виднее. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 27] Автор : rolin Дата : 15.08.2016 20:55 Наверное, после IQ перемножения лучше сумматор применить (а не перемножитель) Там сумматор и применен, написано же x+y, x-y. Кружком с крестиком обозначен условный функциональный блок а его функция рядом, формулой. 15 кГц для WFM (тем более для стерео) наверное маловато будет. А WFM не будет, по крайней мере пока. Перекладывать на быстродействующую ПЛИС обработку по НЧ наверное накладненько будет А в чем же проблема ? Слишком много скорости разве проблема ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 28] Автор : vadim_d Дата : 15.08.2016 21:50 А в чем же проблема ? Слишком много скорости разве проблема ? А душит жаба, вычислитель может на сотне мегагерц работать, а ему 55 кГц прописывают :smile:. Часто используемый вариант, если нет процессорного ядра в FPGA, слепить какое-то быстрое простенькое ядрышко (не чистый изумруд) и в его системе команд делать такую неспешную обработку, логических ресурсов требуется гораздо меньше, нужна небольшая программная память, а ее обычно в современных чипах с запасом Кружком с крестиком обозначен условный функциональный блок С функцией перемножения во временной области, обозначенной крестиком :smile: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 29] Автор : RW3QCF Дата : 15.08.2016 22:05 15 кГц для WFM (тем более для стерео) наверное маловато будет. А WFM не будет, по крайней мере пока. Если диапазон приёма планируется 0-30 MHz, то WFM там и не нужно, и уж тем более стерео. Полоса 15 кГц максимум будет наверное в самый раз. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 30] Автор : rolin Дата : 15.08.2016 22:19 слепить какое-то быстрое простенькое ядрышко (не чистый изумруд) и в его системе команд делать такую неспешную обработку, логических ресурсов требуется гораздо меньше, Да, так правильнее конечно, но это для меня сложно слишком. Кстати в данном пятом циклоне памяти заметно больше, чем в аналогичных 4тых и тем более в 3-их. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 31] Автор : vadim_d Дата : 15.08.2016 22:37 Кстати в данном пятом циклоне памяти заметно больше, чем в аналогичных 4тых и тем более в 3-их Вот-вот, глядишь на процент использованной памяти, и как-то бесполезно она пропадает :smile:. Правда, и PLL, и всякие клочные фичи тоже большей частью остаются невостребованными -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 32] Автор : rolin Дата : 15.08.2016 23:50 не нужно делать всё на одной плате - это здорово ограничивает варианты конструкционного решения... Нужно делать так, чтобы это было законченное устройство в корпусе, а не набор юного конструктора. Ну а кто захочет сделать по-своему - так того ничем не остановишь, переразвести плату и заказать на производстве мелкую партию сейчас это запросто, только плати.. PLL, и всякие клочные фичи тоже большей частью остаются невостребованными PLL мощнецкий там , с дробным делителем 8-) Но я без понятия как это можно применить. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 33] Автор : Alex-31 Дата : 16.08.2016 06:27 КИТ, он же "набор юного конструктора" (как пренебрежительно отозвался коллега) всё таки лучше имхо меня отталкивает, когда ставят условия "шаг влево. шаг вправо - и ничего не получится" нужно оставлять за пользователем свободу конечной реализации если не схемной, то хотя бы конструкционной -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 34] Автор : sgk Дата : 16.08.2016 09:02 нужно оставлять за пользователем свободу конечной реализации если не схемной, то хотя бы конструкционной Приёмник выполнен на вся обработка происходит в единственной микросхеме ПЛИС. В качестве оной выбран Cyclone 5 Проект открытый Проект будет полностью открытый. Значит у Вас есть "главная свобода" это возможность написать свою обработку, своё видение как реализовать приём и обработку сигналов. Ресурсов в Циклоне 5 10-20 кратно больше чем в Циклоне 3 на котором был реализован приёмник QS1R. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 35] Автор : rolin Дата : 17.08.2016 02:56 Почитал немного литературы, общий план SSB декодера таков: 240699 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 36] Автор : UR5ZQV Дата : 17.08.2016 14:06 rolin, наверное не очень много литературы прочитали (а может я). Зачем же полезный IQ на средней частоте 11кГц сразу "заваливать" LPF. Может лучше в демодуляторе, без входных фильтров применить квадратурный перемножитель с подставкой 11 кГц, а после сумматора уж фильтровать и обрабатывать (думаю на частотах 3 кГц даже Ардуина потянет, без навеса). -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 37] Автор : rolin Дата : 19.08.2016 13:18 Зачем же полезный IQ на средней частоте 11кГц сразу "заваливать" LPF На картинках показано, почти весь полезный спектр переносится в реальную область, кроме 0-400 Гц. Это типичный фазофильтровой детектор Уивера. Но вы правы, можно без фильтров, тогда 0-400 Гц придется вырезать потом. применить квадратурный перемножитель с подставкой 11 кГц Почему это 11 кГц , поясните ? При Fs=11k спектр в реальной и мнимой области находится в диапазoне +-5.5к http://www.bsuir.by/m/12_100229_1_85526.pdf Смотрите главу 13 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 38] Автор : VFO Дата : 19.08.2016 14:55 На картинке нарисована входная центральная частота 11.111кГц. И тут же она подаётся на ФНЧ 2.377кГц.Вот и спрашивают, как это? Что останется на выходе? Или принцип действия неправильный, или ошибка в цифрах на рисунке. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 39] Автор : rolin Дата : 19.08.2016 15:11 На картинке нарисована входная центральная частота 11.111кГц. И тут же она подаётся на ФНЧ 2.377кГц. Это не центральная частота, а частота семплирования. На картинке центральная частота обозначена как 0 Гц. В условиях квадратурных данных, центральная частота равна 0, спектр простирается от нее на +(-) Fs/2. Чтобы выделить только реальную (или только мнимую) часть, частота гетеродина должна быть Fs/4. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 40] Автор : UR5ZQV Дата : 19.08.2016 17:22 rolin, если у Вас нулевой IQ сигнал (семплирование 11кГц, это лишь показывает, что Вы сможете видеть 11кГц ширины), то перемножте квадратурно с опорой скажем 1 Гц и после суммирования получите ОДИН сигнал в створе +/- 5.5 кГц от нулевой (т.е. в "отрицательной" и "положительной" области) со сдвигом 1Гц, зеркальные каналы "математически" компенсируются. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 41] Автор : VFO Дата : 19.08.2016 22:33 Это не центральная частота, а частота семплирования. А, ну тогда понятно. то перемножте квадратурно с опорой скажем 1 Гц и после суммирования получите ОДИН сигнал Оно так, но rolin-у же фазофильтровый подавай. А то сильно просто. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 42] Автор : rolin Дата : 19.08.2016 22:54 перемножте квадратурно с опорой скажем 1 Гц и после суммирования получите ОДИН сигнал в створе +/- 5.5 кГц от нулевой Сигнал сдвинется на 1 Гц в какую-то сторону. и чем мне это поможет ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 43] Автор : Genadi Zawidowski Дата : 19.08.2016 23:30 rolin, чтобы взять кусочек спектра (отфильтровать ФНЧ) - преобразуете на 0-ю частоту середину интересующего куска, децимируете, фильтруете и переносите обратно на требуемую частоту. Например, для "классической" полсы пропускания в 3.1 кГц (0.3..3.4 кГц) и приёма LSB на частоте 7090 кГц первый гетеродин ставится на 7088.15, ФНЧ программируются на 1.550, для переноса на звуковую частоту требуется минус 1.85 кГц. Использовать отрицательную/положительную частоту удобнее, чем выбирать сложение или вычитание в алгоритме демодулятора. Погуглите схема Уивера (Weaver receiver). -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 44] Автор : rolin Дата : 20.08.2016 00:13 Genadi Zawidowski, скажите, сигнал NCO, который в середине звукового диапазона давится автоматически ? Зависит от качества NCO ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 45] Автор : Genadi Zawidowski Дата : 20.08.2016 05:56 Это интересная тема, правда как и всё остальное... Давится автоматически, зависимости от качества NCO я не видел. Качество было таким: Выходные значения NCO могут быть даже 16 бит. Но во всех случаях я использовал максимальную разрядность для вычисления: перемножения, а потом суммирования (а затем - возможная фильтрация НЧ сигнала, но это в теме "как шумит радио") - и только потом усечение разрядности до 16 бит для кодека. Во всех вариантах было не менее 24 бит - или целые числа до 64 бит или плавающая точка с её 24 битами мантиссы. Меньше не пробовал. Размер самого NCO практически не влияет - сейчас я остановился на варианте, в котором используется 14 бит фазы - таблица из 4097 значений. Гораздо хуже первый источник слышимого писка - это наводки от FPGA на АЦП. Со вторым источником - неправильным округлением после дециматора при таком построении тракта бороться не надо. Надо его просто сделать правильным. Сразу скажу, установка ФВЧ в тракт это неправильное решение. Поскольку в FPGA при данной архитектуре есть NCO, работающий на частоте попадающей в спектр принимаемого сигнала, наводки с него на АЦП тоже выглядят как писк с частотой 1.85 кГц (на старых записях с демонстрацией приёма с моего радио это хорошо слышно). Борьбу с этим во многих конструкциях - в QS1R, в Гермесе - можно видеть по наличию блока компенсации постоянной составляющей с АЦП - по сути тот же ФВЧ. Я проверял - не помогает. Вернее, эффект есть, но он может меняться по диапазону - даже в пределах 14 мегагерцового любительского эффект то есть то нет. Проверялось так - блок удаления постоянной составляющей сделан отключаемым, управлялся из меню. Гораздо лучше помогает удаление АЦП от ПЛИС на плате - у меня в пяти разных версиях платы это расстояние увеличивалось по сантиметру - и в последних версиях наводок нет. В приложении несколько фотографий - первый вариант и некоторые из последних. Обратите внимание на взаимное расположение этих микросхем. АЦП 2208/2217 под радиатором. В первой версии были забыты переходные отверстия под АЦП (а отверстие для пайки донышка оказалось с термобарьером) - грелось страшно. Плата 4 слоя. Рассматривая чужие конструкции, выполненные на 8-10 слоях (вероятно), тенденцию к максимальному удалению АЦП от ПЛИС было видно и на них. В своих трансиверах разделения земель не делал, считаю что в данной технике это только хуже. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 46] Автор : rolin Дата : 20.08.2016 13:22 Борьбу с этим во многих конструкциях - в QS1R, в Гермесе - можно видеть по наличию блока компенсации постоянной составляющей с АЦП - по сути тот же ФВЧ Дело в том, что в тех конструкциях нету NCO , работающего на звуковой частоте, поэтому нет никакой связи модулей с борьбой от наводок. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 47] Автор : UR5ZQV Дата : 20.08.2016 14:22 rolin, Сигнал сдвинется на 1 Гц в какую-то сторону. и чем мне это поможет ? Сдвинуться в сторону в зависимости от сочетания входного "I" и "Q" и 2-го IQ перемножителя (т.е. на какой перемножитель, кос. или син. Вы направите эти сигналы). Полоса декодирования (ВБП или НБП) при ОБП таким способом зависит от того, суммируете ли Вы или вычитаете после этого, ну ес-но от фильтрации и обработки после этого (все ес-но, программно). А "подмешивать" можно хоть 2.75кГц, лишь бы все спектры обрабатывались при возможностях Вашего Fs, при этом можно "бегать" по частоте в "створе" этих возможностей. Первая "половина" обработки так и делается в ПЛИС (ну только добавляется децимация, с целью "понизится" по частоте в пределах заданной ширины обзора или обработки, о чем подсказывал vadim_d, чтоб "жаба не душила" за финансы и трудоемкость на обработку НЧ на ПЛИС). Извините, сумбурно может пояснил (не обладаю педагогическими талантами), наверное лучше серия статей Richard Lyons или KF6DX (привожу только 1-ю часть, чтоб место не занимать), где системно и понятно поясняется алгоритм кодирования/декотдирования почти всех видов модуляции при ЦОС (почти все, я применял и другие, но это уж на Вашу фантазию). Хотя есть и много другой литературы (хорошей и разной). -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 48] Автор : Genadi Zawidowski Дата : 20.08.2016 16:54 NCO , работающего на звуковой частоте, поэтому rolin, наводки от NCO работающего на радиочастоте. NCO на звуковой это программная сущность внутри DSP. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 49] Автор : rolin Дата : 20.08.2016 17:21 UR5ZQV, спасибо за литературу. Советовать смещать частоту на 1 Гц с вашей стороны было опрометчиво. наводки от NCO работающего на радиочастоте. Никогда не сталкивался с этим. В реализации алгоритма Cordic, с помощью которого переносится спектр, радиочастота как таковая отсутствует. Проблема проекта в том, что для Cyclone V вся стандартная DSP платная, то есть закрыта для использования. Даже обычные фильтра придется лепить самому. Сейчас рассматриваю разные варианты, кручу Матлаб и его Filter Builder. Преобразователь Гильберта получается вполне приличным на картинке и не требует много ресурсов. Если кто знает открытые проекты, в которых реализованы фильтра на верилоге или другие программы, позволяющие синтезировать фильтра на верилоге, прошу помочь. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 50] Автор : Genadi Zawidowski Дата : 20.08.2016 18:21 На электрониксе выкладывали... rolin, вы пока идеи на платном варианте проверьте (оно умеет некоторое время работать) - а когда всё станет понятно начнете заменять на своё. В начале очень помогает - мне за день удалось первую прошивку приёмника сделать. Для информации - многие из Альтеровских IP CORES умеют работать в многоканальном режиме - экономя логику. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 51] Автор : rolin Дата : 20.08.2016 19:44 Смотрю Гильберта, всего 32 порядок и нормально получается 240970 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 52] Автор : ikSS Дата : 21.08.2016 00:49 Это интересная тема, правда как и всё остальное... В приложении несколько фотографий - первый вариант и некоторые из последних..... .....Плата 4 слоя. Геннадий, а вы не планируете свой проект сделать доступным общественности.? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 53] Автор : Genadi Zawidowski Дата : 21.08.2016 01:05 Программная часть общедоступна. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 54] Автор : Nicky Дата : 21.08.2016 08:25 Если кто знает открытые проекты, в которых реализованы фильтра на верилоге или другие программы, позволяющие синтезировать фильтра на верилоге, прошу помочь. Мог бы помочь, но я пишу на VHDL. Сделал проект DDC приемника на плате Марсоход2: http://marsohod.org/forum/proekty-polzovatelej/4115-ddc-priemnik-na-plate-marsokhod2 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 55] Автор : UR5ZQV Дата : 21.08.2016 10:28 rolin, UR5ZQV, спасибо за литературу. Советовать смещать частоту на 1 Гц с вашей стороны было опрометчиво. Я этого не знал. Сам использую декодер с переменной ПЧ +/-24кГц при Fs 48кГц для СДР первого поколения (не принципиально, каким способом получается входной IQ сигнал, аналоговым или цифровым). ПС: Если заметили, я написал "скажем 1Гц" (т.е. к примеру). :). Если Вам скажем важно сохранить значение нулевой ПЧ. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 56] Автор : Sergey_gh Дата : 22.08.2016 00:39 Если кто знает открытые проекты, в которых реализованы фильтра на верилоге или другие программы, позволяющие синтезировать фильтра на верилоге, прошу помочь. Вы про обычный FIR? А зачем для этого альтеровская DSP библиотека? Это же один из самых простых узлов. Вот мой самописный из старого проекта (тоже цифровой приёмник) FIR 1000-ого порядка. Ещё для 2-го циклона. Деталей уже не помню, просто выдернул модуль из проекта. // ========================================================================== // КИХ ФИЛЬТР // ========================================================================== // коэффициенты фильтра расчитаны в MATLAB(fdatool) // Разрядность коэффициентов = 24 bit // Кол-во коэф. должно быть нечетное // ---------------------------------------------- // Коэфициенты всех фильтров 24 разряда, знаковые. // Отнормировано 24 разряда -> +- 0.25 для всех фильтров для простой замены // набора коэфициентов без дополнительного нормирования в программе. // Прямая сумма всех коэфициентов всех фильтров ~= 4 * 2^23 = 4 * 8388608 // Сумма модулей всех Коэфициентов: // 500 - ~= 5 * 2^23 // 2700 - ~= 8.05 * 2^23 // 6000 - ~= 9.35 * 2^23 // 10000 - ~= 10.11 * 2^23 // 12500 - ~= 10.46 * 2^23 // Коэфициент передачи фильтра от 18 битного входа до 28 битного выхода = 0.25 // т.е постоянный сигнал на входе = +131071 (2^17) даст на выходе 0.25 * 2^27 // ---------------------------------------------- module fir( input clk, input en, input en_fast, input [1:0] scale, input signed [17:0] I, input signed [17:0] Q, input [8:0] c_addr, input [23:0] c_data, input c_wren, output reg signed [27:0] I_out, output reg signed [27:0] Q_out ); parameter N_coeff = 1001; parameter N_half = (N_coeff - 1)/2; // -------------------------------------------------------------------------- reg [9:0] addr_wr; // АДРЕС ДЛЯ ЗАПИСИ ВХОД. ДАННЫХ reg [9:0] addr_rd; // АДРЕС ДЛЯ ЧТЕНИЯ ДАННЫХ reg [8:0] addr_coeff; // АДРЕС ДЛЯ ЧТЕНИЯ КОЭФ. ФИЛЬТРА reg [5:0] dly; reg up, dn; // АККУМУЛЯТОРЫ ФИЛЬТРА reg signed [31:0] I_acc, Q_acc; wire signed [17:0] I_pipe, Q_pipe; wire signed [23:0] coeff; wire signed [23:0] I_product, Q_product; // MUX ЧТЕНИЯ/ЗАПИСИ ДАННЫХ wire wren = en_fast; // ========================================================================== always @(posedge clk) begin if(en_fast) addr_wr <= addr_wr + 1'b1; if(en) begin addr_rd <= addr_wr; addr_coeff <= 9'b0; up <= 1'b1; dn <= 1'b0; end else if(up | dn) begin addr_rd <= addr_rd - 1'b1; if(addr_coeff == (N_half - 1)) begin up <= 1'b0; dn <= 1'b1; end if(up) addr_coeff <= addr_coeff + 1'b1; else begin if(addr_coeff == 9'b0) dn <= 1'b0; else addr_coeff <= addr_coeff - 1'b1; end end // -------------------------------------------------------------------------- dly <= {dly[4:0],(up | dn)}; if(dly[4]) begin I_acc <= I_acc + {{8{I_product[23]}},I_product}; Q_acc <= Q_acc + {{8{Q_product[23]}},Q_product}; end else if(dly[5]) begin // МАСШТАБИРОВАНИЕ И ВЫВОД РЕЗУЛЬТАТА I_out <= (scale == 2'd0)? I_acc[31:4] : (scale == 2'd1)? I_acc[30:3] : (scale == 2'd2)? I_acc[29:2] : I_acc[28:1] ; Q_out <= (scale == 2'd0)? Q_acc[31:4] : (scale == 2'd1)? Q_acc[30:3] : (scale == 2'd2)? Q_acc[29:2] : Q_acc[28:1] ; I_acc <= 28'd0; Q_acc <= 28'd0; end end // ========================================================================== // СИНХР. УМНОЖИТЕЛИ 18*24 bit(СО ЗНАКОМ) 3 clk m_24x18s inst0_m_24x18s ( .A(I_pipe), .B(coeff), .clk(clk), .product(I_product) ); m_24x18s inst1_m_24x18s ( .A(Q_pipe), .B(coeff), .clk(clk), .product(Q_product) ); // ========================================================================== // ПАМЯТЬ ВХОДНЫХ ОТСЧЕТОВ I,Q 1024 x 18bit // set the maximum block depth = 512 (иначе перерасход блоков памяти) /* ram1024x18_rdwr inst0_ram1024x18_rdwr ( .clock(clk), .rdaddress(addr_rd), .wraddress(addr_wr), .data(I), .wren(wren), .q(I_pipe) ); ram1024x18_rdwr inst1_ram1024x18_rdwr ( .clock(clk), .rdaddress(addr_rd), .wraddress(addr_wr), .data(Q), .wren(wren), .q(Q_pipe) ); */ // FOR SIMULINK wire [8:0] I_pipe_1, I_pipe_0, Q_pipe_1, Q_pipe_0; assign I_pipe = {I_pipe_1, I_pipe_0}; assign Q_pipe = {Q_pipe_1, Q_pipe_0}; ram1024x9_rdwr inst0_ram1024x9_rdwr ( .clock(clk), .rdaddress(addr_rd), .wraddress(addr_wr), .data(I[8:0]), .wren(wren), .q(I_pipe_0) ); ram1024x9_rdwr inst1_ram1024x9_rdwr ( .clock(clk), .rdaddress(addr_rd), .wraddress(addr_wr), .data(Q[8:0]), .wren(wren), .q(Q_pipe_0) ); ram1024x9_rdwr inst2_ram1024x9_rdwr ( .clock(clk), .rdaddress(addr_rd), .wraddress(addr_wr), .data(I[17:9]), .wren(wren), .q(I_pipe_1) ); ram1024x9_rdwr inst3_ram1024x9_rdwr ( .clock(clk), .rdaddress(addr_rd), .wraddress(addr_wr), .data(Q[17:9]), .wren(wren), .q(Q_pipe_1) ); // ========================================================================== // ПАМЯТЬ КОЭФИЦИЕНТОВ ФИЛЬТРА 512 x 24bit ram512x24_coeff inst_ram512x24_coeff ( .clock(clk), .address_a(addr_coeff), .data_a(24'd0), .wren_a(1'b0), .q_a(coeff), .address_b(c_addr), .data_b(c_data), .wren_b(c_wren) //.q_b() ); endmodule // ========================================================================== -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 57] Автор : rolin Дата : 22.08.2016 01:24 Sergey_gh, Ооо, какие люди! А вы не хотели бы отдать исходники того вашего приемника на растерзание мне ? А то работы много сделали, чего ж добру пропадать ? Я бы нашел им применение в этом проекте. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 58] Автор : Sergey_gh Дата : 22.08.2016 18:32 А вы не хотели бы отдать исходники того вашего приемника на растерзание мне ? Нет, пока нет такого желания. .. чего ж добру пропадать ? Добро не пропало :) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 59] Автор : UR3IQO Дата : 22.08.2016 21:19 Сейчас рассматриваю разные варианты, кручу Матлаб и его Filter Builder. Преобразователь Гильберта получается вполне приличным на картинке и не требует много ресурсов. А у меня фазовый демодулятор/модулятор работает без преобразователя Гильберта ;)8-) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 60] Автор : rolin Дата : 22.08.2016 22:02 А у меня фазовый демодулятор/модулятор работает без преобразователя Гильберта Так то понятно, вот и я выбираю, фазовый детектор (Уивера) либо Гильбертом делать. судя по тому, что матлаб вырисовывает, Гильбертом проще получится и вполне качественно. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 61] Автор : UR3IQO Дата : 22.08.2016 23:14 Так то понятно, вот и я выбираю, фазовый детектор (Уивера) либо Гильбертом делать. Уивер это фазофильтровый, а у меня чисто фазовый, но без Гильберта. Просто считается пара ПФ один из которых разворачивает фазу на 90 градусов (относительно второго) ПГ при этом не нужен :) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 62] Автор : rolin Дата : 22.08.2016 23:41 Просто считается пара ПФ один из которых разворачивает фазу на 90 градусов (относительно второго) ПГ при этом не нужен А этот фильтр держит фазу постоянной только в полосе пропускания или везде ? Не подскажете, как рассчитать обычный ПФ с определенным поворотом фазы ? Хотелось бы сделать 2 ПФ, один +45 рад, второй -45 град. Это возможно ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 63] Автор : UR3IQO Дата : 22.08.2016 23:57 А этот фильтр держит фазу постоянной только в полосе пропускания или везде ? Конечно не везде, но подавление нежелательной боковой получается в соответствии с АЧХ фильтров, выглядит это как пример так: 241128 В этом варианте разность фаз поддерживается между выходами двух фильтров, а не между входом и выходом фильтров. Хотелось бы сделать 2 ПФ, один +45 рад, второй -45 град. Это возможно ? Если Вы про фазу на выходе относительно входа фильтров, то мне простые методы неизвестны. Если про разницу на выходе фильтров, то можете принять в одном канале +45 в другом -45, вместо 90 и 0 градусов, работа схемы от этого не изменится :). -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 64] Автор : rolin Дата : 23.08.2016 00:12 UR3IQO, спасибо, понятно. Сразу фильтровать до нужной полосы с одновременной селекцией боковой полосы это наиболее экономное решение по ресурсам получается, ничего лучше и не придумать. А вы можете подсказать, как рассчитать такие фильтра в FDA? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 65] Автор : UR3IQO Дата : 23.08.2016 08:23 А вы можете подсказать, как рассчитать такие фильтра в FDA? Я FDA не пользуюсь. Считаете обычный ФНЧ с полосой в два раза меньше необходимой, потом генерируете синусоиду и косинусоиду с частотой равной центральной частоте полосового фильтра, умножаете на коэффициенты ФНЧ и получаете два полосовых фильтра (LPF*cos и LPF*sin) вот собственно и все. Если не поняли как это делать, я могу кусочек матлабовского скрипта привести. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 66] Автор : UR5ZQV Дата : 23.08.2016 09:51 rolin, Смотрю Гильберта, всего 32 порядок и нормально получается Для подавления зеркалки на 40дБ требуется неравномерность в полосе пропускания ок. 0.1дБ (по картинке это не похоже). Для более высоких требований, еще выше. И еще неприятности Гильберта, ограниченная полоса, и сложность оперативного изменения параметров, требуется генерация нового фильтра (а у меня еще, при неточной входной IQ, еще и трудность коррекции фазы). ПС: наверное правильнее назвать 32-точечный (если это FIR). ПС2: у себя демодуляцию AM/NFM, делал тупо, с рабочей нулевой (уже один канал) перебрасывал на 12 кГц, затем ФВЧ небольшого порядка с максимально линейным скосом, затем АМ детектирование и фильтрация, шоб не трогать основной канал ОБП. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 67] Автор : Sergey_gh Дата : 23.08.2016 12:37 Сразу фильтровать до нужной полосы с одновременной селекцией боковой полосы это наиболее экономное решение по ресурсам получается, ничего лучше и не придумать.У Вас ресурсов в плис в 10 раз больше, чем было у меня. Влезет 10 приёмников точно :) А вот с Гильбертом, imho, больше мороки. Преобразователь к краям разъезжается по фазе и амплитуде. Полосовой подчисточный фильтр будете ставить? И при переключении полосы менять полосы и там и тут? И не забывайте про его групповую задержку, которую нужно компенсировать во втором квадратурном канале. А чем не нравиться 2 FIR-а по IQ каналам и домножение на комплексную экспоненту? Никакого тона в середине полосы пропускания не слышно и на спектре не видно. Это же цифра. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 68] Автор : rolin Дата : 23.08.2016 12:56 Считаете обычный ФНЧ с полосой в два раза меньше необходимой, потом генерируете синусоиду и косинусоиду с частотой равной центральной частоте полосового фильтра, умножаете на коэффициенты ФНЧ и получаете два полосовых фильтра (LPF*cos и LPF*sin) вот собственно и все. А можно и с полосовым фильтром это сделать ? У вас на картинке полосовой. Непонятен момент, что значит генерировать синусоиду с частотой ? Я могу рассчитать таблицу периода синуса с определенным шагом. А что значит с частотой ? А чем не нравиться 2 FIR-а по IQ каналам и домножение на комплексную экспоненту? Потому, что NCO, который 24 битный будет занимать очень прилично места. И даже 16-ти битный. Если делать перенос на Fs/4, то можно обойтись без NCO и умножителей, но тогда придется ставить еще один ФОС на выходе ( рисунок приводил выше). Самый лучший вариант - это только 2 фильтра, которые сдвигают фазу на 90гр между собой, что Олег предлагает. Это одновременно и ФОС и Гильберт. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 69] Автор : Sergey_gh Дата : 23.08.2016 13:11 Потому, что NCO, который 24 битный будет занимать очень прилично места. И даже 16-ти битный. Крошечным его можно сделать по меркам этой плис. У меня в древней плис 18 битный NCO занимал менее 5%. Вот с таким спектром http://www.cqham.ru/forum/attachment.php?attachmentid=13022&d=1188395465 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 70] Автор : UR3IQO Дата : 23.08.2016 13:16 А можно и с полосовым фильтром это сделать ? У вас на картинке полосовой. Прочитайте внимательно ФНЧ используется как база для ПФ, после умножения на синусоиду(косинусоиду) у Вас получится ПФ из двух половинок ФНЧ. Смотрите ниже. Непонятен момент, что значит генерировать синусоиду с частотой ? Я могу рассчитать таблицу периода синуса с определенным шагом. А что значит с частотой ? С частотой это так же как в NCO делается. Ну, а если с определенным шагом, то шаг будет 2*pi*f/Fs, где f - частота синусоиды, Fs - частота дискретизации. Вот скрипт для матлаба: bpfi = cos(2*pi*Fc/Fs*(-L/2:L/2)) .* lpf; bpfq = sin(2*pi*Fc/Fs*(-L/2:L/2)) .* lpf; lpf - вектор коэффициентов FIR ФНЧ, полоса ФНЧ равна половине полосы ПФ L - кол-во тапов ФНЧ минус один (кол-во тапов должно быть нечетным) Fc - центральная частота ПФ Fs - частота дискретизации bpfi, bpfq - два вектора с коэффициентами ПФ потом можете посмотреть, что получилось командой: fvtool(bpfq,1,bpfi,1) Да, если исходный ФНЧ будет с линейной ФЧХ, то один ПФ будет с симметричными коэффициентами, другой с антисимметричными коэффициентами, это можно использовать, чтобы уменьшить объем памяти или, в некоторых случаях, немного оптимизировать скорость выполнения/используемые ресурсы. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 71] Автор : rolin Дата : 23.08.2016 13:38 после умножения на синусоиду(косинусоид у) у Вас получится ПФ из двух половинок ФНЧ. Так значит фильтра выполнят функцию переноса, то есть заменят NCO с умножителями. Хитро. А если я помножу коэффициенты фильтров на значения синуса и косинуса для нулевой частоты, то переноса не будет, будет просто выделение боковой по типу как с Гильбертом. Тоже вариант кстати. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 72] Автор : Sergey_gh Дата : 23.08.2016 13:56 .. будет просто выделение боковой по типу как с Гильбертом. Не будет :) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 73] Автор : rolin Дата : 23.08.2016 14:16 Не будет Н-да, будет перенос на 0 Гц, то есть ничего не изменится. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 74] Автор : UR3IQO Дата : 23.08.2016 14:36 Так значит фильтра выполнят функцию переноса, то есть заменят NCO с умножителями. Нет фильтра функцию переноса выполнять не могут и не выполняют. Все работает так же, как и с обычным Гильбертом. А если я помножу коэффициенты фильтров на значения синуса и косинуса для нулевой частоты, то переноса не будет, будет просто выделение боковой по типу как с Гильбертом. Как уже отметил Сергей не будет - один фильтр будет из нулей, а второй будет исходным ФНЧ :) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 75] Автор : rolin Дата : 23.08.2016 15:04 Нет фильтра функцию переноса выполнять не могут и не выполняют. Все работает так же, как и с обычным Гильбертом. Нет, входные отсчеты будут умножены в фильтре не только на коэффициенты, но и на функцию синуса/косинуса той частоты, где окажется середина получившегося фильтра. Это перенос спектра с нулевой частоты. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 76] Автор : Sergey_gh Дата : 23.08.2016 16:24 .. входные отсчеты будут умножены в фильтре не только на коэффициенты, но и на функцию синуса/косинуса .. Нет, это будет свёртка с отсчётами синуса/косинуса. f(t) - сигнал, g(t) - коэф. фильтра, h(t) - синус/косинус, * - символ свёртки. Во временной области - (f*(gh))(t) В частотной получим - F(w)(G*H)(w) Видите поворот? Там свёртка с Дираком для косинуса и с Дираком умноженным на i для синуса. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 77] Автор : UR3IQO Дата : 23.08.2016 16:35 Нет, входные отсчеты будут умножены в фильтре не только на коэффициенты, но и на функцию синуса/косинуса той частоты, где окажется середина получившегося фильтра. Распишите математические действия которые будут выполнены и Вы увидите, что это не так. Будет перенесен не сигнал, а фильтр - т.е. ФНЧ в одном канале и "фильтр с нулями" (т.е. его отсутствие) дают симметричную АЧХ относительно "нулевой частоты" (фактически обычный DSB приемник с одним смесителем и ФНЧ), а мы "сдвигаем" АЧХ этого фильтра при умножении на комплексную синусоиду (пару синусоида-косинусоида). Возможно так будет понятнее, что происходит, по крайней мере я старался :) Если при приеме по методу Уивера (где сдвигается сигнал) Вам нужно будет настраивать гетеродин посередине фильтра, то в данном случае гетеродин будет на частоте подавленной несущей, т.е. никакого сдвига сигнала нет - обычный фазовый демодулятор. P.S. Вот Сергей Вам то же самое в математическом виде расписал. Осталось только заметить, что h(t) это комплексная синусоида h(t)=exp(-j w t), и h(t)g(t) во временной области будет эквивалентно сдвигу в частотной области G(W+w). -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 78] Автор : UR5ZQV Дата : 23.08.2016 16:55 rolin, т.е. под каждый необходимый Вам новый параметр, генерируется "новый" фильтр, хоть по моему ИМХУ, легче гетеродин гонять с перемножителем (IQ, по НЧ), механизмы для этого гораздо проще (итерационное, "на лету" вычисление тригонометрических функций из "предыдущей", операции сложения и умножения, две переменных, две других константы-переменные, высчитываются только при смене частоты). Но Вам виднее. Да, и проблем со "звоном" на нулевой частоте у Автора не должно быть, это ж все таки DDC, там не откуда взяться "околонулевым шумам", как в полуаналоге. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 79] Автор : UR3IQO Дата : 23.08.2016 17:27 т.е. под каждый необходимый Вам новый параметр, генерируется "новый" фильтр, хоть по моему ИМХУ, легче гетеродин гонять с перемножителем (IQ, по НЧ), механизмы для этого гораздо проще Этот вопрос в принципе привязан к аппаратной части. Мне было бы сложнее это делать ввиду особенностей цифрового процессора и очень большого ДД в этом месте (у меня здесь идет обработка с разрядностью 48бит, т.к. 24бита не хватает - ДД АЦП в полосе 500Гц у меня немного меньше 140дБ :crazy:). Никакой проблемы пересчитывать фильтры "на лету" (при смене параметров фильтров) нет. Я сейчас это делаю в фоновом режиме и перестройка фильтров происходит незаметно на слух - без артефактов, но здесь опять же многое зависит от железа. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 80] Автор : rolin Дата : 23.08.2016 17:39 Будет перенесен не сигнал, а фильтр Спасибо за пояснения, теперь понятно. легче гетеродин гонять с перемножителем (IQ, по НЧ), механизмы для этого гораздо проще Согласен, это проще и универсальнее. Такой вопрос - достаточно ли на этапе конечной обработки 16-ти разрядов для коэффициентов ? То есть данные будут 24-бит а коэффициенты фильтров и NCO будет 16-ти битными ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 81] Автор : Nicky Дата : 24.08.2016 07:42 Что касается NCO. Есть формула: Fs = (Ft * Z) / 2 ** n, где Fs - выходная частота синтезатора; Ft - тактовая частота синтезатора; Z - код частоты; n - разрядность синтезатора. Если Ft = 60 МГц, а Z = 1 (дискрет перестройки частоты), то при n = 16 Fs будет 915,5 Гц. Шаг перестройки ~1кГц устраивает? При Ft = 60 кГц Fs уже будет 1 Гц. Добавлено через 10 минут(ы): DEL DEL -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 82] Автор : Sergey_gh Дата : 24.08.2016 21:04 Такой вопрос - достаточно ли на этапе конечной обработки 16-ти разрядов для коэффициентов ? То есть данные будут 24-бит а коэффициенты фильтров и NCO будет 16-ти битными ? У меня данные после CIC фильтра были 18 бит, коэф. фильтра 24 битные, выходные данные 28 бит. Что мешает посмотреть как влияет разрядность коэф. фильтра на АЧХ в fdatool? Я не знаю децимацию CIC фильтра, но, по-моему, 24 битные данные до FIR-ов - это избыточно. Если не секрет, сколько ресурсов нынче (можно в % от плис) занимают эти электронные кубики из DSP библиотеки? Я в них обычно не играю. Вот Николай выше рекомендует сделать простую вещь. Накопитель фазы 10 битный, двухпортовую память 1024x24бит, положить в память 1 период синуса и смириться с большим шагом перестройки получившегося NCO. 15 минут работы. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 83] Автор : UR3IQO Дата : 24.08.2016 21:36 Вот Николай выше рекомендует сделать простую вещь. Накопитель фазы 10 битный, двухпортовую память 1024x24бит, положить в память 1 период синуса и смириться с большим шагом перестройки получившегося NCO. 15 минут работы. Я предлагаю добавить к этому интерполяцию Тейлором и радоваться малому шагу :) - еще на часок работы :) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 84] Автор : rolin Дата : 24.08.2016 22:04 Если не секрет, сколько ресурсов нынче (можно в % от плис) занимают эти электронные кубики из DSP библиотеки? Я в них обычно не играю. Я не использую блоки стандартной библиотеки DSP, потому что она для пятого циклона платная. Квартус не генерит файл прошивки а предлагает только сконфигурировать ПЛИС через JTAG и то, работать будет только 15 минут после этого. А у меня на плате JTAG вообще не предусмотрен, так что этот вариант отпадает. Накопитель фазы 10 битный, двухпортовую память 1024x24бит, положить в память 1 период синуса А зачем так много - 1024 ? У меня кордик входной с 32битной фазой имеет таблицу арктангенса в 32 значения. А с 16-ти битной фазой он имеет соответственно всего 16 значений. Занимает он 600 ALM, что примерно столько же, чем и первый varcic. Всего в плисине 9400 ALM, на данный момент занято 25% -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 85] Автор : Sergey_gh Дата : 24.08.2016 22:34 А зачем так много - 1024 ? У меня кордик входной с 32битной фазой имеет таблицу арктангенса в 32 значения. А с 16-ти битной фазой он имеет соответственно всего 16 значений. Занимает он 600 ALM, что примерно столько же, чем и первый varcic. Всего в плисине 9400 ALM, на данный момент занято 25% Мы видимо о чём-то о разном. Я предлагаю решение занимающее 10-15 ALM - 0.1% от лог. ресурсов плис. И 2-3 блока M10K - 1.5% от накристальной памяти. 600 ALM - это не просто много, это запредельно. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 86] Автор : vadim_d Дата : 28.08.2016 00:25 А у меня на плате JTAG вообще не предусмотрен Вот тут может погорячились, иногда альтеровским сигналтапом бывает удобно смотреть, что там в реальном железе, если вдруг его поведение расходится с симуляцией -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 87] Автор : rolin Дата : 08.09.2016 12:10 Долго боролся я вот с этим непотебством 242446 Никак не соображу, ведь код точно такой же, что используется в DDC Module 1 и там все прекрасно работает без глюков. Оказалось - виноват генератор. Самый обычный рандомный генератор на 66.666666. В следующей ревизии платы придется предусмотреть что-нибудь посерьезней рандомного генератора, потому что на эту частоту нормального генератора сейчас не купить. В данный момент процессор управляет частотой первого NCO, на экране индикация, через кодек вывожу квадратуры на наушники. Частота семплов 13 кГц, на кодек вывожу без всякой интерполяции, пока так. Все готово для организации обработки второй ступени. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 88] Автор : rolin Дата : 21.09.2016 00:31 Пытаюсь запустить фильтр, что давал Сергей выше. Переделал чуток под 24 бит вход и выход, пока коэффициенты в ROM, 200 порядок. Не могу сообразить, что подавать на входы en и en_fast. clk, как я понимаю любой достаточно высокий по отношению к семплрейту. И еще подскажите, коэффициенты матлаб выдает во флоат, а как мне его в обычное число перевести, только не вручную. Файл инициализации памяти поддерживает только десятичные и шестнадцатеричные значения. // ==========================================================================// КИХ ФИЛЬТР // ========================================================================== // коэффициенты фильтра расчитаны в MATLAB(fdatool) // Разрядность коэффициентов = 24 bit // Кол-во коэф. должно быть нечетное // ---------------------------------------------- // Коэфициенты всех фильтров 24 разряда, знаковые. // Отнормировано 24 разряда -> +- 0.25 для всех фильтров для простой замены // набора коэфициентов без дополнительного нормирования в программе. // Прямая сумма всех коэфициентов всех фильтров ~= 4 * 2^23 = 4 * 8388608 // Сумма модулей всех Коэфициентов: // 500 - ~= 5 * 2^23 // 2700 - ~= 8.05 * 2^23 // 6000 - ~= 9.35 * 2^23 // 10000 - ~= 10.11 * 2^23 // 12500 - ~= 10.46 * 2^23 // Коэфициент передачи фильтра от 18 битного входа до 28 битного выхода = 0.25 // т.е постоянный сигнал на входе = +131071 (2^17) даст на выходе 0.25 * 2^27 // ---------------------------------------------- module firfilt( input clk, input en, input en_fast, input signed [23:0] I, input signed [23:0] Q, //input [8:0] c_addr, //input [23:0] c_data, //input c_wren, output reg signed [23:0] I_out, output reg signed [23:0] Q_out ); parameter scale = 2'd3; // parameter N_coeff = 201; parameter N_half = (N_coeff - 1)/2; // -------------------------------------------------------------------------- reg [7:0] addr_wr; // АДРЕС ДЛЯ ЗАПИСИ ВХОД. ДАННЫХ reg [7:0] addr_rd; // АДРЕС ДЛЯ ЧТЕНИЯ ДАННЫХ reg [6:0] addr_coeff; // АДРЕС ДЛЯ ЧТЕНИЯ КОЭФ. ФИЛЬТРА reg [5:0] dly; reg up, dn; // АККУМУЛЯТОРЫ ФИЛЬТРА reg signed [31:0] I_acc, Q_acc; wire signed [23:0] I_pipe, Q_pipe; wire signed [23:0] coeff; wire signed [23:0] I_product, Q_product; // MUX ЧТЕНИЯ/ЗАПИСИ ДАННЫХ wire wren = en_fast; // ========================================================================== always @(posedge clk) begin if(en_fast) addr_wr <= addr_wr + 1'b1; if(en) begin addr_rd <= addr_wr; addr_coeff <= 7'b0; up <= 1'b1; dn <= 1'b0; end else if(up | dn) begin addr_rd <= addr_rd - 1'b1; if(addr_coeff == (N_half - 1)) begin up <= 1'b0; dn <= 1'b1; end if(up) addr_coeff <= addr_coeff + 1'b1; else begin if(addr_coeff == 7'b0) dn <= 1'b0; else addr_coeff <= addr_coeff - 1'b1; end end // -------------------------------------------------------------------------- dly <= {dly[4:0],(up | dn)}; if(dly[4]) begin I_acc <= I_acc + {{8{I_product[23]}},I_product}; Q_acc <= Q_acc + {{8{Q_product[23]}},Q_product}; end else if(dly[5]) begin // МАСШТАБИРОВАНИЕ И ВЫВОД РЕЗУЛЬТАТА I_out <= (scale == 2'd0)? I_acc[31:8] : (scale == 2'd1)? I_acc[30:7] : (scale == 2'd2)? I_acc[29:6] : I_acc[28:5] ; Q_out <= (scale == 2'd0)? Q_acc[31:8] : (scale == 2'd1)? Q_acc[30:7] : (scale == 2'd2)? Q_acc[29:6] : Q_acc[28:5] ; I_acc <= 32'd0; Q_acc <= 32'd0; end end // ========================================================================== // СИНХР. УМНОЖИТЕЛИ 18*24 bit(СО ЗНАКОМ) 3 clk m_24x24s inst0_m_24x24s (clk, I_pipe, coeff, I_product); // m_24x24s inst1_m_24x24s (clk, Q_pipe, coeff, Q_product); // // ========================================================================== // ПАМЯТЬ ВХОДНЫХ ОТСЧЕТОВ I,Q 256 x 24bit // set the maximum block depth = 64 (иначе перерасход блоков памяти) ram256x24 inst0_ram1024x24 (clk, I, addr_rd, addr_wr, wren, I_pipe); // ram256x24 inst1_ram1024x24 (clk, Q, addr_rd, addr_wr, wren, Q_pipe); // // ========================================================================== // ПАМЯТЬ КОЭФИЦИЕНТОВ ФИЛЬТРА 128 x 24bit rom128x24_coeff inst_ram128x24_coeff (addr_coeff, clk, coeff); /* ( .clock(clk), .address_a(addr_coeff), //.data_a(24'd0), //.wren_a(1'b0), .q_a(coeff), .address_b(c_addr), .data_b(c_data), .wren_b(c_wren) ); */ endmodule // ========================================================================== -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 89] Автор : UR3IQO Дата : 21.09.2016 07:42 коэффициенты матлаб выдает во флоат, а как мне его в обычное число перевести, только не вручную. Если я Вас правильно понял, то вот скрипт, задаете кол-во коэффициентов в n, сами коэффициенты в b, и выполняете. Получаете в файле 1.txt коэффициенты (24бита). %n - кол-во коэффициентов %b - коэффициенты fid=fopen('1.txt','w'); for i = 1:n, fprintf(fid, ' %.0f\n',b(i)*2^24); end fclose(fid); Под нужный Вам формат допилите сами. P.S. Считать коэффициенты в FDATool непродуктивно, хотя если у Вас немного фильтров, то можно и так... -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 90] Автор : rolin Дата : 21.09.2016 10:40 UR3IQO, спасибо. Альтеровский Fir Compiler отлично считает, особенно по Блекману, всего 200 порядок. Только коэфф во флоат. 243374 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 91] Автор : UR3IQO Дата : 21.09.2016 11:11 Альтеровский Fir Compiler отлично считает, особенно по Блекману, всего 200 порядок. Все зависит от задач :) Я использую скрипты для матлаба для полностью автоматического расчета всех фильтров, таблиц и т.п. Не представляю как это можно было бы подсчитать какими-нить GUI инструментами - одних фильтров основной селекции у меня 240штук по 511 коэффициентов :crazy: (сгенерированный ассемблерный файл имеет размер 3МБ и более 132тыс. строк :shock:). -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 92] Автор : rolin Дата : 21.09.2016 11:47 UR3IQO, задал массив коэффициентов так: b(256)= {0.0 ,0.0 ,0.0 ,0.0 ,1.89069E-6 ,2.3217E-6 ,... . ... }; А оно ругается - Conversion to double from cell is not possible. Если задать одно число b=1.89069E-6 ; то работает -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 93] Автор : UR3IQO Дата : 21.09.2016 12:01 UR3IQO, задал массив коэффициентов так: b(256)= {0.0 ,0.0 ,0.0 ,0.0 ,1.89069E-6 ,2.3217E-6 ,... . ... }; А оно ругается надо было так: b = [ 0.0 0.0 0.0 0.0 1.89069E-6 2.3217E-6 ... . ... ] FDATool в походящем виде может экспортировать коэффициенты в Матлабовский Workspace - помнится ему достаточно задать имя переменной и все. И да, можете добавить n=length(b) если хотите сохранить весь вектор, и не хотите указывать в явном виде кол-во сохраняемых элементов. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 94] Автор : rolin Дата : 21.09.2016 16:55 Ура ! Маленький шажок к успеху сделан. Подправил чуток фильтр, который уже был у меня в проекте от Алекса VE3NEA, чтобы он не децимировал на 2. Рассчитал 256 коэффициентов в Altera Fir Compiler и получил такой фильтр на 1500 Гц, занимает всего 60 LUT 243401 На слух, при 1500 Гц отстройки, наблюдается некоторое снижение громкости, а при отстройке еще на 100 Гц уже ничего не слышно. Теперь следующий шаг - требуется компактный NCO. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 95] Автор : Kursa-51 Дата : 21.09.2016 18:40 rolin, Вы такой талантливый человек (без лести), скажите, а почему промышленность (за исключением спец. техники) ничего подобного не выпускает в массовом исполнении, у меня вот только яхт бой, сижу на Ваши разработки смотрю, как кот облизываюсь. Известны ли Вам случаи, когда некоторая фирма взяла бы опен-сурсе под свое крыло. Почему бы Вам с Гос. корпорацией не вступить, в сотрудничество. В России я так понимаю пробить данный проект, тяжело будет. Китайцы унесут, но они все первым делом деньги считают. Я немного знаком с техникой времен Великой Отечественной, конечно немцы талантливые инженеры, были и есть. Можно новый Армейский приемник сделать, это не SDR в том понимании, что к нему еще комп долепливать надо. Я компьютерщик, от души желаю Вам все Ваши разработки без Пентиумов воплотить. Это не зависимое, функционально законченное устройство. Гибриды ПЭВМ, полу SDR, на помойку. p.s. Навеяно тем, что SDR, на компе отключат когда нибудь по команде, я про Андроид здесь на форуме писал, два чела, я и мой начальник, ничего не могут сделать, отключили ген. директора от Гос. сайта, намертво, сломали комп, тайно и подло. rolin, поверьте, это стоит денег, то, что без ПЭВМ, успехов Вам. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 96] Автор : Alex-31 Дата : 21.09.2016 18:56 Kursa-51, это вам Пион-DSP радиоприёмник (http://www.cqham.ru/forum/showthread.php?21964-%CF%E8%EE%ED-DSP-%F0%E0%E4%E8%EE%EF%F0%E8%B8%EC%ED%E8%EA) для стимулирования слюноотделения :ржач: у вояк свои запросы и свои институты/производители а для начала массового производства нужен массовый спрос - а откуда ему быть, если все ДВ/СВ/КВ вещательные станции закрыли... :cry: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 97] Автор : Kursa-51 Дата : 21.09.2016 19:15 если все ДВ/СВ/КВ вещательные станции закрыли...Рискну, а почему в устав СРР, не внести пометку, может обладать лицензией на радиовещание, я так понял сайт тут серьезный. Я знаю, про частное радиовещание, но это АМ, знаю, что на семерке 7045 и кажется в районе 10 МГц, есть какая то болтовня (с матом). Нужно просто взять в свои руки и отдать радиолюбителям сектор вещания, я почему очень оценил работу автора, обыватель, т.е финансист, который захочет купить этот приемник, разумеется не согласится, что он полу, как еще компьютер добавить. А что, если ветераны радиолюбительства будут рассказывать о своем прошлом в живом эфире, но для всех ( к сожалению уже не все). Нужна глобальная идея, как пробить функционально законченные аппараты SDR на рынок, та же коммерция может начать вещать в цифровом формате, нужно два фактора, первый убеждение (немного на политику смахивает, Вы становитесь владельцем некоторой технологии) и второе репутация спецов радио связи, коими являются все радиолюбители данного форума. В Метро (блин каждое утро читаю) миллионные дома крутят, пусть и SDR впишут. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 98] Автор : rolin Дата : 21.09.2016 19:31 Вы такой талантливый человек .... Почему бы Вам с Гос. корпорацией не вступить, в сотрудничество. Что вы, я просто смышленый и не более того. Мои возможности как программиста очень ограниченны. а почему промышленность (за исключением спец. техники) ничего подобного не выпускает в массовом исполнении Потому, что это нужно только небольшому количеству аматоров, а у них и так есть полно альтернатив. Вся эта цифровая обработка применяется давным-давно, только в гораздо более серьезных устройствах, а то, что я делаю - это просто баловство. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 99] Автор : Alex-31 Дата : 21.09.2016 19:42 :offtop:Kursa-51, вот на моей улице подростки, у каждого смартфон - или играют, или музыку/видео проигрывают с флешки, или серфят по ФМ-станциям... и такой набор развлечений подростка устраивает... некоторых приглашал неоднократно к себе, крутил им флаки, винил, катушки - система у меня не "высокий конец", но вполне достойна и что? никакого огонька в глазах, никакого интереса выходят от меня, затычки в уши и снова долбят свои мозги мп3-рэпом... :evil: чем КВ вещание может заинтересовать таких подростков? не знаю...:facepalm: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 100] Автор : rolin Дата : 21.09.2016 22:01 Сделал таблицу полного периода синуса на 1024 значения, со знаком. Сделал перемножители и сумматор, то есть все, что требуется для декодера SSB. Осталось выяснить как управлять таблицей, чтобы получить NCO. Максимальная требуемая частота 5 кГц. Могу ли я использовать тактовую частоту для NCO равную частоте семплов 13 кГц ? В этом случае точность установки частоты при 10-ти битном накопителе будет 12.77 Герц , чего достаточно вполне для данного проекта. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 101] Автор : rolin Дата : 21.09.2016 23:23 Еще сильно смущает, что уровень шума такого NCO будет только -80дБ , это наверное повлияет на входной сигнал. Тогда нужно делать перемножение уже после АРУ. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 102] Автор : UR3IQO Дата : 21.09.2016 23:29 Осталось выяснить как управлять таблицей, чтобы получить NCO. "Скачете" по элементам с нужным шагом (шаг будет определять частоту NCO). Могу ли я использовать тактовую частоту для NCO равную частоте семплов 13 кГц ? А как иначе? Еще сильно смущает, что уровень шума такого NCO будет только -80дБ Почему? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 103] Автор : romanetz Дата : 22.09.2016 09:36 У альтеры ж есть NCO, по их конфигуратору прикинуть требуемые параметры, а потом с такими уже свое городить. NCO не обязательно табличный, есть еще несколько алгоритмов (навскидку, квадратурный осцилятор, который с синусом и косинусом. Тем более, что есть проц, который будет коэффициенты вгружать при смене частоты. module gen (input clk, input fast_clk, input init, output wire signed [15:0] data); parameter signed [63:0] cosw=64'd2132199158; //cos(2*pi*19000/1000000) parameter signed [63:0] sinw=64'd255759203; //sin(2*pi*19000/1000000) reg signed [63:0] cost; reg signed [63:0] sint; reg signed [68:0] tmp; reg signed [68:0] tmp2; initial begin cost<=64'h7F000000; sint<=64'h0; end //this algorithm is long-therm unstable always @(posedge clk or fast_clk) if (init) begin cost<=64'h7F000000; sint<=64'h0; end else begin /* cc= cost * cosw; ss= sint * sinw; cs= cost * sinw; sc= sint * cosw;*/ tmp=cost * cosw - sint * sinw; tmp2=cost * sinw + sint * cosw; cost=$signed({tmp[68],tmp[61:31]}); sint=$signed({tmp2[68],tmp2[61:31]}); end assign data=$signed({sint[32],sint[31:17]}); endmodule Можно и 16-18 бит получить, тем более, что частота отсчетов у него совсем небольшая нужна, значит, скоростью можно пожертвовать в пользу количества ALM. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 104] Автор : rolin Дата : 22.09.2016 10:22 Почему? Почему шум 80 дБ или почему меня это смущает ? Я посмотрел в Квартусе, для 10-ти битного NCO, шум не может быть лучше -80дБ, а в данном месте собственный шум приемника свыше -120дБ NCO не обязательно табличный, есть еще несколько алгоритмов (навскидку, квадратурный осцилятор, который с синусом и косинусом. Тем более, что есть проц, который будет коэффициенты вгружать при смене частоты. Нет процессор не будет ничего загружать. В плисине овердофига памяти и все, что можно, делается с использовании памяти. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 105] Автор : UR3IQO Дата : 22.09.2016 11:47 У альтеры ж есть NCO А он бесплатный? для 10-ти битного NCO, шум не может быть лучше -80дБ, а в данном месте собственный шум приемника свыше -120дБ 10битного чего - аккумулятора фазы, разрядности таблицы синусов? И для какой частоты. Если Вы берете 10ти битную фазу и работаете без усечения фазы ошибки фазы у Вас просто нет (а Вы, как я понял, именно так собрались делать). Сделайте нужную разрядность значений синуса и будет Вам сколько хотите. Проблемы начинаются когда разрядность аккумулятора берется больше размера таблицы синусов, тогда появляется ошибка. Но и здесь можно за счет интерполяции (теми же рядами Тейлора) получить любую нужную Вам точность. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 106] Автор : rolin Дата : 22.09.2016 12:08 UR3IQO, ситуация такая - 1024 значения синуса в таблице с 24 бит точностью. Адрес этой памяти 10 бит и именно столько и в накопителе. Собственно нет никакого накопителя, я просто каждый такт приращиваю к адресу 133, при тактовой 13к как раз и получается 1700 Гц на выходе. Я вывел наружу получившийся сигнал и он весьма убогий, всего 7 отсчетов на полупериод. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 107] Автор : romanetz Дата : 22.09.2016 12:24 Налицо явное противоречие. У аналоговых девиц видел материал про фазовые и амплитудное шумы NCO, найду сейчас, кину ссылку. Соврал, не у них. http://lib.tkk.fi/Diss/2000/isbn9512253186/isbn9512253186.pdf -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 108] Автор : rolin Дата : 22.09.2016 12:50 romanetz, тут видимо это не совсем то NCО про который мы подумали. Помните теорию, для переноса на 1/4 от Fs нужно умножать семплы на последовательность 0, -1, 0, 1 ? Вот тут из той же оперы. Нету тут никаких шумов, это просто математика. Добавлено через 9 минут(ы): Короче, работает перенос. И, кстати, точность установки частоты этого примитивного NCO не влияет на точность настройки на частоту всего приемника, так как это легко скомпенсировать сдвигом основного NCO приемника. Добавлено через 6 минут(ы): Вот сигнал с NCO, выведенный через звуковой кодек 243474 А вот его код reg [9:0] sin_addr = 1'd0; wire [9:0] cos_addr = sin_addr + 9'd256; wire signed[23:0] sin, cos; nco_rom_1024 nco_rom (sin_addr, cos_addr, clock_66M, sin, cos); wire [9:0] nco_z = 10'd133; // for 1700 Hz (1698) always @(posedge clock_66M) begin if (strobe) sin_addr <= sin_addr + nco_z; end -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 109] Автор : romanetz Дата : 22.09.2016 12:53 У кодека частота дискретизации явно выше, чем у NCO, отсюда такой кривой сигнал. Фильтр на частоту Найквиста этого NCO сделает из него нормальный сигнал -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 110] Автор : rolin Дата : 22.09.2016 13:20 У кодека частота дискретизации явно выше, чем у NCO, отсюда такой кривой сигнал Нет, просто у него 1024/133 отсчетов на период и чем выше нужная частота, тем меньше отсчетов. Фильтр, конечно, выровнял бы его, но похоже, что не нужно это в данном случае. Добавлено через 17 минут(ы): Действительно, интерполирующий фильтр надо поставить, зачем эти искажения слушать... Итак, SSB декодер готов. Следующий шаг - АРУ. Есть мысли как это сделать максимально хорошо ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 111] Автор : Genadi Zawidowski Дата : 22.09.2016 13:32 Как делал я (если "ХОРОШО" - это лучше для слушателя): АРУ "вперёд", по сигналу после фильтров. состоит из двух частей - одна обеспечивает амплитудные характеристики, другая - временные. Амплитудные - в зависимости от режима - либо "плоская" - всегда обеспечивается заданный уровень, либо "спортивная" - на сколько-то децибел входного изменения даём, например, 1 дБ выходного сигнала. "амплитудная" часть получает уровень с интегрирующих блоков с разными временами - с "быстрой" цепи - для реакции на помехи и с медленной цепи - для обычного "отпускания". В медленную цепь хорошо бы добавить "hold" - замораживание выходного уровня детекторов (усиления) на какое-то время после начала уменьшения входного сигнала. Вот так примерно выглядит математика амплитудной части у меня: FLOAT_T levelfence = 0x7FFFFF00; // Число немного меньше, чем INT32_MAX, с 23 значащими битами. Преобразуется без потерь точности во float. 0x7fffff80; static FLOAT_T agcfactor;// = - (1 - (FLOAT_T) OUTRANGE / INPRANGE); static FLOAT_T calcagcfactor(int rate) { return - (1 - 1 / (FLOAT_T) rate); } static FLOAT_T calcstreingth(FLOAT_T level0, int flatgain) { const FLOAT_T level = FMINF(fmaxf(minsignal, level0), levelfence); // работаем в диапазоне от 1 до levelfence const FLOAT_T ratio = level / levelfence; return ratio; } static FLOAT_T calcgain(FLOAT_T streingth, int flatgain) { if (flatgain) { // flat gain return 1 / streingth; } else { FLOAT_T streingth_log10 = LOG10F(streingth); return POWF(10, streingth_log10 * agcfactor); } } Это упрощённый код из тестового примера, в SVN где обычно в файле audio.c полная версия. На мой взгляд, для приёма АМ оптимальна "плоская" АРУ. А вот так "временная" часть: // детектор АРУ - выходное значение пропорционально сигналу // со всеми положенными задержками на срабатывание/отпускание static FLOAT_T performagc(const volatile agcparams_t * agcp, agcstate_t * st, FLOAT_T sample) { // быстрая цепь АРУ if (agcp->agcoff) { // разряд со скоростью agcp->dischargespeedfast // заряд мгновенно charge2(& st->agcfastcap, MAKETAUAF0(), agcp->dischargespeedfast); } else if (st->agcfastcap < sample) { // Заряд происходит мгновенно st->agcfastcap = sample; } else { // разряд со скоростью agcp->dischargespeedfast charge2(& st->agcfastcap, sample, agcp->dischargespeedfast); } // медленная цепь АРУ // hang time processing if (st->agcslowcap < st->agcfastcap) // требуется заряд slow цепи { // заряжается charge2(& st->agcslowcap, st->agcfastcap, agcp->chargespeedslow); st->agchangticks = agcp->hungticks; } else if (st->agcslowcap > st->agcfastcap) // требуется заряд slow цепи { if (st->agchangticks == 0) { // разряжается charge2(& st->agcslowcap, st->agcfastcap, agcp->dischargespeedslow); } else { // Ждем окончания hang time st->agchangticks -= 1; } } else { // не меняется значение st->agchangticks = agcp->hungticks; } return FMAXF(st->agcfastcap, st->agcslowcap); // разница после ИЛИ } -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 112] Автор : UR3IQO Дата : 22.09.2016 13:54 Следующий шаг - АРУ. Есть мысли как это сделать максимально хорошо ? Боюсь в объеме форума это не вместится :) Если в двух словах использую АРУ вперед, время заряда немного меньше ноля, разряд, наклон х-ки и все остальное регулируемое. Делается довольно просто, но в вычислительном плане выходит довольно затратно даже в таком простом варианте. Самая сложная задача это обеспечить низкие ИМД одновременно с мгновенным срабатыванием, и при этом еще нужно чтобы работе АРУ не мешали импульсные помехи. Я недавно модифицировал свою АРУ и похоже добился желаемого эффекта (надо как-нибудь записать wavчик для демонстрации :)), но испытания в "боевых условиях" еще впереди, ну и полный вариант явно не для маленькой ПЛИС. По амплитудной х-ке пока у меня +- то же, что продемонстрировал Геннадий, но хочу немного переделать, правда пока некогда. Добавлено через 5 минут(ы): А вот так "временная" часть: При таком построении будут лишние искажения. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 113] Автор : Genadi Zawidowski Дата : 22.09.2016 13:58 У меня время зарада быстрой цепи "0", у Олега "немного меньше ноля" - это значит алгоритм "с заглядыванием вперёд"? Во всей "классике" с программами на персоналках для плавного срабатывания держится очередь будущего сигнала и максимального значения из этой очереди... ещё те тормоза, не хуже FFT. Я решил отфильтровать "хруст" от мгновенного сбрасывания усиления фильтром за детектором. При таком построении будут лишние искажения. Олег, чуть больше слов на объяснение выделите пожалуйста. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 114] Автор : rolin Дата : 22.09.2016 14:40 Сделать буфер, чтобы была возможность анализировать сигнал, который "мог бы быть" , чтобы влиять на сигнал который "будет" ? Заглядывание вперед, значится. Это даст задержку, конечно, но для данного класса приемника это не проблема. и это... В Верилоге нет возможности считать логарифмы кажись... -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 115] Автор : UR3IQO Дата : 22.09.2016 15:42 у Олега "немного меньше ноля" - это значит алгоритм "с заглядыванием вперёд"? Да, "с заглядыванием". Во всей "классике" с программами на персоналках для плавного срабатывания держится очередь будущего сигнала и максимального значения из этой очереди... ещё те тормоза, не хуже FFT. У меня немного не так, если брать базовый вариант (который не обладает хорошим иммунитетом к импульсным помехам), то он попроще, а если полный, то все намного хуже, чем Вы описали :) Олег, чуть больше слов на объяснение выделите пожалуйста. Обычно возникает проблема из-за модулирования процессами происходящими в быстрой цепи АРУ основного сигнала. Уровень возникающих искажений будет зависеть от формы сигнала. Представьте двухтональный сигнал, на пике огибающей быстрая цепь заряжается мгновенно, а медленная цепь отстает, в этот момент АРУ управляется исключительно быстрой цепью. Потом, через некоторое время (уже на спаде "горба" огибающей) быстрая цепь "передаст управление" медленной, и до следующего пика будет происходит медленный разряд медленной секции АРУ, потом опять все повторится. Моменты, когда АРУ управляется быстрой цепью будут создавать повышенные искажения из-за модуляции основного сигнала. Ситуацию можно улучшить, если быстрая цепь будет срабатывать при уровне выше (скажем на 3дБ), чем медленная (или выдавать сигнал управления меньший, чем от медленной, что в общем-то эквивалентно), тогда время работы быстрой цепи сократится до минимума (во многих случаях она будет задействована только во время переходного процесса при быстром увеличении входного сигнала), но на переходной х-ке появится выброс и опять же после скачка сигнала АРУ некоторое время будет управляться только быстрой цепью. Короче я как не плясал вокруг такой архитектуры желаемого эффекта не добился, и хотя АРУ работала лучше аналоговых собратьев :), посчитал, что можно (и нужно) еще лучше :roll:. В Верилоге нет возможности считать логарифмы кажись... А Вы думаете в ассемблере есть (у меня вся программа DSP на ассемблере :crazy:)? Руками все считается достаточно просто... -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 116] Автор : romanetz Дата : 22.09.2016 21:57 Раз памяти дофига - то и логарифм считать таблично... -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 117] Автор : UR3IQO Дата : 22.09.2016 22:18 Раз памяти дофига - то и логарифм считать таблично... Зачем? Логарифма достаточно двоичного, а он весьма неплохо (точность около 8бит) аппроксимируется простым полиномом y(x)=4.0 * (-0.3372223*x*x + 0.9981958*x - 0.6626105) на отрезке 0.5 <= x < 1.0, расширить вычисления на всю область определения тривиальная задача. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 118] Автор : Genadi Zawidowski Дата : 22.09.2016 22:48 Я думал про двоичный... в исходном значении (в long представлении) посчитать позицию левого ненулевого бита... кривовато (слишком грубо) получается с такой точностью. Хотя, если задаться фиксированным отношением на 12 дБ входного изменения - 1 дБ выходного - может и можно остаться на целочисленке. Я думал - позицию бита и 4 (например) рядом с ним находящихся бита использовать как аргумент -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 119] Автор : rolin Дата : 22.09.2016 23:08 есть вопрос. Предположим, делаем АМ декодер для последовательности Fs=13kHz, фильтра по 5кГц. Делаем I^2 + Q^2 получаем АМ декодирование. Вопрос - каким образом получится на выходе ширина спектра 10 кГц и что будет, если она не помещается в текущий семплрейт ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 120] Автор : Genadi Zawidowski Дата : 22.09.2016 23:16 Делаем I^2 + Q^2 Делаем SQRT(I^2 + Q^2) Не забыть про постоянную составляющую. 10 кГц на входе - 5 кГц на выходе. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 121] Автор : rolin Дата : 22.09.2016 23:22 Genadi Zawidowski, не совсем понятно. Пришло 5 кГц в реальной области и 5 кГц в мнимой. На выходе должно быть 10 кГц полоса, правильно ? Догнал. Спектр АМ сигнала вдвое шире спектра модулирующего -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 122] Автор : UR3IQO Дата : 23.09.2016 09:40 Я думал про двоичный... в исходном значении (в long представлении) посчитать позицию левого ненулевого бита... кривовато (слишком грубо) получается с такой точностью. Ничего грубого - загоняется в диапазон 0.5..1, потом интерполяция. Точность выходит более чем достаточная (что-то около 0.03дБ). Все остальное пересчитывается без проблем из десятичных в двоичные (та и любые другие) логарифмы тоже. Пришло 5 кГц в реальной области и 5 кГц в мнимой. На выходе должно быть 10 кГц полоса, правильно ? На выходе тоже 5кГц, вроде сами уже разобрались. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 123] Автор : rolin Дата : 24.09.2016 14:16 Переделал систему тактирования, теперь задающий генератор 64 МГц. Поддержка SDR по протоколу SDR-IQ уходит от нас, и черт с ним. Потом разберемся, свой протокол сделаю. Главное - это приемник автономный сделать. Теперь первая ступень выдает одновременно два потока, один с частотой семплов 12.5 кГц - для декодирования SSB и CW, второй - 25кГц, для отображения панорамы и декодирования АМ. Звуковой кодек теперь работает в том же тактовом домене, что и первая ступень, на частоте 50 кГц. Сделал интерполятор с фильтром - звук в наушниках идеальный. Сделал АМ декодер, с квадратным корнем, хотя говорят, что не нужен он, достаточно возведения в квадрат. Пока не испытывал. Теперь нужно АРУ сделать и можно считать, что приемник готов. Всего занято 26% обьема лог элементов, 13% памяти. ДСП блоки таят потихоньку, уже 56% использовано. Есть одна проблема - при перестройке наблюдаются заметные щелчки. Первый NCO у меня кордик, думаю надо настройку изменять в какой-то определенный момент времени, чтобы фаза не скакала. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 124] Автор : rolin Дата : 25.09.2016 22:29 Пытаюсь чего-то сообразить по АРУ.... Организовываю АРУ уже после детекторов, то есть по сформированному звуку - это же нормально ? И такой вопрос возник - АРУ же конкретно испортит параметры фильтров, я как-то не думал раньше об этом. Что делать ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 125] Автор : UR3IQO Дата : 25.09.2016 23:49 Организовываю АРУ уже после детекторов, то есть по сформированному звуку - это же нормально ? У меня так. Можно и квадратуры обрабатывать - у каждого метода свои плюсы-минусы. И такой вопрос возник - АРУ же конкретно испортит параметры фильтров, я как-то не думал раньше об этом. Что делать ? Чего это вдруг? И что именно АРУ может в фильтрах испортить? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 126] Автор : rolin Дата : 26.09.2016 00:01 И что именно АРУ может в фильтрах испортить? Так ведь получается, если сигнал уже фильтруется, АРУ скомпенсирует падение уровня и фильтр уже не фильтрует - так понимаю. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 127] Автор : UR3IQO Дата : 26.09.2016 00:16 Так ведь получается, если сигнал уже фильтруется, АРУ скомпенсирует падение уровня и фильтр уже не фильтрует - так понимаю. АРУ одинаково усиливает и сигнал, и помеху. Фильтр ослабляет помеху, а сигнал пропускает, поэтому х-ку фильтра АРУ никак испортить не может. Естественно, если просто перестраивать приемник вокруг мощного сигнала, то без АРУ сигнал будет совсем пропадать выходя за полосу фильтра, а с АРУ может оставаться слышимым - тут уже все зависит от глубины АРУ и подавления фильтров, но такой "тест" не несет особой полезной информации и смысла в нем не много. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 128] Автор : rolin Дата : 26.09.2016 00:31 Вот, нарисовал свои переживания. Вот уж меня заглючило. На схеме исполнительный блок - это усилитель, который будет усиливать сигнал при необходимости. 243757 Добавлено через 12 минут(ы): Я просто подумал, что если некий фильтр создает разность между сигналами в 80дБ (к примеру) а АРУ после него сжимает диапазон на 80дБ, то фильтра как-бы нет. То есть сигнал, не попадающий в полосу фильтра будет слышен с той же громкостью, что и сигнал попадающий в полосу пропускания. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 129] Автор : rolin Дата : 26.09.2016 21:33 Сделал простейшее АРУ, чтобы было от чего отталкиваться. Работает так: Сигнал задерживается в кольцевом буфере на 256 семплов, что для рейта 12500 составляет 20мс. Пока сигнал задерживается, пиковый детектор определяет наибольшее значение для текущих 256 семплов. Каждый раз, когда результат пикового детектора готов, он сравнивается с заданным значением уровня и принимается решение увеличить или уменьшить усиление на 1 шаг. По итогу имеем сильные искажения, но в целом АРУ работает. Что посоветуете ? Может заменить пиковый детектор на усреднение ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 130] Автор : Sergey_gh Дата : 26.09.2016 21:58 Что посоветуете ? Если мне не изменяет память, я использовал вот этот документ. Там подробно всё расписано. Не знаю насколько описанные там алгоритмы актуальны сейчас, но выглядит логично. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 131] Автор : UR3IQO Дата : 26.09.2016 22:02 Что посоветуете ? Может заменить пиковый детектор на усреднение ? Посоветую переделать АРУ - сделайте управление вперед. Детектор можно оставить простой пиковый (просто модуль от сигнала), далее сделайте ФНЧ первого порядка, его "заряд" делайте с малой постоянной времени, "разряд" с большой. Далее сравниваете полученный сигнал с ФНЧ с порогом, выбираете максимальный из двух, получается управляющий сигнал АРУ. Потом делите принимаемый сигнал на управляющий сигнал АРУ - вот и вся АРУ. До "шедевра" такой АРУ далеко, но работать должна без искажений. Если добавите логарифмирование и експоненту, сможете избавиться от деления и сделать постоянными временнЫе параметры АРУ. Я тут за последние дни еще немного допилил АРУ у себя, щас наверное темку заведу про свой аппарат, продемонстрирую :) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 132] Автор : rolin Дата : 30.09.2016 16:34 Что-то тупанул я с этим АРУ. Сделал пиковый детектор, типа как RC-цепочка с диодом, которая мгновенно заряжается и медленно разряжается в течении 1 секунды. Сделал регулировку усиления на умножителе, только непонятно как теперь это соединить. Детектор выдает 24 бит сигнал в диапазоне 0-8млн, усилитель требует такой же управляющий сигнал. Что такое управление вперед ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 133] Автор : VFO Дата : 30.09.2016 17:25 Это когда детектор берёт сигнал до управляемого узла. Таким образом в отличии от управления "назад", можно получить любую регулировочную характеристику, хоть плоскую, хоть с отрицательным уклоном. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 134] Автор : rolin Дата : 30.09.2016 17:36 Это когда детектор берёт сигнал до управляемого узла Хорошо, у меня там 24 бит сигнал с соответствующим возможным диапазоном значений, которые никак не будут меняться при управлении усилением. Получается, это система без обратной связи ? Так как же задавать регулировочную характеристику ? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 135] Автор : Tadas Дата : 30.09.2016 17:44 Получается, это система без обратной связи ? С управлением вперёд так и есть, ОС отсутствует. Так как же задавать регулировочную характеристику ? Функциональный преобразователь изобразите. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 136] Автор : UR3IQO Дата : 30.09.2016 18:11 Хорошо, у меня там 24 бит сигнал с соответствующим возможным диапазоном значений, которые никак не будут меняться при управлении усилением. Получается, это система без обратной связи ? Да Так как же задавать регулировочную характеристику ? Я ж писал о самом просто случае: получается управляющий сигнал АРУ. Потом делите принимаемый сигнал на управляющий сигнал АРУ - вот и вся АРУ. Это даст Вам плоскую АРУ - все сигналы на выходе будут с одинаковым пиковым уровнем. Как добавить порог, и сделать АРУ не плоской думаю уже догадались. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 137] Автор : ua9xos Дата : 19.02.2018 18:14 Тема совсем заглохла. А жаль... очень интересно посмотреть на результат -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [Сообщение 138] Автор : US8IDZ Дата : 08.05.2019 17:53 Тема совсем заглохла. А жаль... очень интересно посмотреть на результат может приемную часть этого приемника скрестить с этим http://www.cqham.ru/forum/showthread.php?39377-%CF%F0%E8%E5%EC%ED%E8%EA-quot-%CC%E0%EB%E0%F5%E8%F2-DSP-quot-%C0%E2%F2%EE%ED%EE%EC%ED%FB%E9-%EF%EE%F0%F2%E0%F2%E8%E2%ED%FB%E9-SDR ну хотя бы частично использовав уже имеющиеся разработки по приемнику который здесь обсуждается... опыт сотрудничества вроде имелся http://www.sdr-deluxe.com/news/ddc_module_1/2016-03-19-25 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Downloaded from Форум CQHAM.RU (http://www.cqham.ru/forum) at 29.03.2024 09:34.