Автор |
Сообщение |
|
Дата: 20 Янв 2023 09:32:58
#
vladisslav2011
придется все-таки вешать дополнительный FIR на выходе.
IQ_2_Real и обратно, если что. |
|
Дата: 20 Янв 2023 22:13:31
#
Programmist
IQ_2_Real и обратно
Что-то такое я уже видел где-то здесь
https://github.com/vladisslav2011/ExtIO_sddc
Правда тут дополнительно реализован доворот фазы до точного запрошенного значения центральной частоты. Нормально так и не заработало. |
Реклама Google
|
|
|
Дата: 21 Янв 2023 08:22:56
#
vladisslav2011
Что-то такое я уже видел
Я прочесть на си всё равно не смогу, а доворот фазы при I/Q FFT преобразовании не требуется.
|
|
Дата: 21 Янв 2023 09:59:59
#
доворот фазы при I/Q FFT преобразовании не требуется.
Как тогда выполнить перенос спектра на точное значение частоты?
Например идет поток с того же RX-888mk2 на 128Msps, нужно перенести спектр с нуля на 7000123 герца для приема телеграфа на этой частоте (или просто потому, что пользователь в клиентской прогамме на эту частоту нстроился), параллельно неплохо бы отфильтровать и перейти на более низкую частоту дискретизации, так как для телеграфа 128Msps явно избыточны. 128M FFT никакой современный процессор за разумное время не выполнит, так что только доворачивать.
|
|
Дата: 21 Янв 2023 14:25:55 · Поправил: Programmist (21 Янв 2023 15:28:52)
#
vladisslav2011
Как тогда выполнить перенос спектра на точное значение частоты?
В функции IQ_2_Real никак, но можно попробовать в один цикл FFT добавить код переноса спектра из функции SpectrumShift. Будет перенос на дискретное значение, на точное нельзя.
Весь фокус в том, чтобы правильно рассчитать необходимую точность дискретного значения.
Без структурной схемы всего устройства не могу советовать в каком месте и что лучше делать.
Когда занимался изучением сигналов из эфира, на первом месте была IQ_2_Real, и только потом сдвиг спектра, демодуляция и децимация (на последнем).
Она же (децимация) и создаёт иллюзию точной настройки на частоту, так как операция не дискретная, а свёрточная.
Как-то так, но могу и ошибиться, много воды утекло, а Windows у Вас нет, чтобы выслать на мыло пример для сравнения скорости работы.
|
|
Дата: 21 Янв 2023 21:15:50
#
Без структурной схемы всего устройства
На КВ так как-то:
Антенна => ФНЧ => аттеньюатор + VGA => балун => LTC2208 => CYUSB3014 => PC
Отсчеты идут действительные. IQ там нет.
на первом месте была IQ_2_Real
Ээээ.... IQ_2_Real это демодуляция SSB. Демодуляция SSB должна происходить после фильтрации комплексным FIR фильтром. Это почти последняя операция перед выводом в звуковую карту. После нее может быть только AGC/ресэмплирование, хотя можно и до.
Она же (децимация) и создаёт иллюзию точной настройки на частоту
Какое отношение имеет децимация к точной настройке?
Точная настройка делается умножением на синусоиду, генерируемую через фазовый аккумулятор, чтобы избежать разрыва фазы между блоками. Это можно делать хоть до децимации, хоть после (если фильтрация выполняется правильно).
не дискретная, а свёрточная.
У нас в любом случае после АЦП дискретные отсчеты и по времени и по значению.
FIR получается все-таки используется?
Пример в виде exe что-ли? Паскаль же можно собрать fpc если в исходниках.
|
|
Дата: 21 Янв 2023 21:38:42 · Поправил: Programmist (21 Янв 2023 21:48:42)
#
vladisslav2011
IQ_2_Real это демодуляция SSB
IQ_2_Real это IQ_2_Real, а Real_2_IQ обратно, не более того.
Какое отношение имеет децимация к точной настройке?
Точно не помню, у меня было как-то связано, но это не значит что правильно.
На КВ так как-то:
Антенна => ФНЧ => аттеньюатор + VGA => балун => LTC2208 => CYUSB3014 => PC
Это не структурная схема.
Структурная схема большая и её, как правило, всем рисовать лень, потому что это половина работы.
FIR получается все-таки используется?
Нет, все фильтры FFT.
Пример в виде exe что-ли?
Да.
Паскаль же можно собрать fpc если в исходниках.
Нет, не собрать. Там много специфических модулей и вывод звука другой.
|
|
Дата: 21 Янв 2023 22:38:58 · Поправил: vladisslav2011 (21 Янв 2023 22:43:01)
#
IQ_2_Real это IQ_2_Real
Для меня это демодуляция SSB/2PSK (если после Costas loop).
Зачем вообще переходить к real, повышая в 2 раза частоту оцифровки, получая геморрой с зеркалками и проблемы с демодуляцией фазовой (частотной) модуляции и основанных на ней xFSK/xPSK и невозможность, наверное, демодуляции xQAM, если можно работать с IQ без ограничений и на в 2 раза меньшей частоте оцифровки - в 2 раза быстрее?
Это не структурная схема.
Смысл там в том, что антенна подключена на вход АЦП через ФНЧ и сэмплы гонятся на компьютер без какой-либо обработки в железе.
Неструктурная схема https://github.com/ik1xpv/BBRF103/blob/master/HARDWARE/BBRF103_scheme.pdf
вывод звука другой.
А зачем вообще вывод звука? Для профилирования собирается тест, который читает сэмплы из stdin, обрабатывает, записывает в stdout, считая время работы функции DSP и число обработанных сэмплов. Размер блока желательно чтобы настраивался через define или аргументом. Прогоняется на тестовом IQ, чтобы проверить корректность обработки, прогоняется из /dev/zero через dd для ограничения объема в /dev/null, чтобы проверить скорость... Процессор перед тестом на скорость лочится на минимальной тактовой частоте для честного сравнения реализаций (так он гарантированно не перегреется, не полезет в турбо и задержки памяти будут меньше влиять). |
|
Дата: 21 Янв 2023 22:57:26 · Поправил: Programmist (22 Янв 2023 01:21:34)
#
vladisslav2011
Зачем вообще переходить к real
Если с выхода SDR получаем I/Q, то и вся последующая обработка должна быть в I/Q.
В теории это быстрей и проще, но у меня таких функций нет.
А зачем вообще вывод звука?
Как зачем, а зачем тогда приёмник? Вот здесь и нужен переход в Real, желательно быстрый на FFT и без FIR.
//
Попробовал я часть выбросить, чтобы можно было протестировать на другой операционной системе, но нет, слишком крепко всё привязано.
Неструктурная схема https://github.com/ik1xpv/BBRF103/blob/master/HARDWARE/BBRF103_scheme.pdf
В общем, понятно, из моего набора может быть полезна только IQ_2_Real на FFT.
А будь оно 64-х разрядным, было бы ещё лучше.) |
|
Дата: 22 Янв 2023 02:56:32 · Поправил: LFSR (22 Янв 2023 02:56:54)
#
Для меня это демодуляция SSB/2PSK (если после Costas loop).
Кто-то ее еще так делает? Сейчас что 1985? bPSK элементарно детектируется линией задержки(без всяких там ограничителей нормировок и т.д.). А qPSK это два раздельных bPSK.
P.S.: ...тема уходит куда-то в космос, но еще раз повторюсь - я дал довольно исчерпывающий совет в самом начале. FFT тут никаким боком...
|
|
Дата: 22 Янв 2023 03:07:30 · Поправил: Programmist (22 Янв 2023 03:15:59)
#
LFSR
FFT тут никаким боком...
Без FFT это и есть 1985 год.
Другое дело, что надо отталкиваться от схемы, а её возможности не велики.
Если охота строить FIR по 200 порядков, стройте, никто не запрещает.
|
|
Дата: 22 Янв 2023 03:48:00
#
Тыкать FFT во все места не признак большого ума.
Если охота строить FIR по 200 порядков, стройте, никто не запрещает.
Автору топика это не надо, у него все решит децимация и волне себе сносная фильтрация.
|
|
Дата: 22 Янв 2023 06:01:51
#
Извините что вторгаюсь в ваш интеллектуальный дискус с дилетанским вопросом, но не подскажите ли готовый инструмент (в linux) чтобы нормализовать по амплитуде IQ файл формата GQRX (f32le) чтобы с минимальными потерями выплюнуть его в hackRF (который всего лишь восьмибитный)? Может ли upsample помочь расширить динамику и снизить потери? Исходный файл в samplerate 1MS/s. Вопрос прежде всего к vladisslav2011 наверное. Скрипты luaradio / gnuradio приветствуются, но они явно не заточены под работу с файлами.
|
|
Дата: 22 Янв 2023 10:58:05 · Поправил: Programmist (22 Янв 2023 13:26:23)
#
LFSR
Тыкать FFT во все места не признак большого ума.
Не признак большого ума добиваться высокой точности, после того, как сигнал в процессоре прошёл дискретную обработку.
И считать 32 бита из 12 возможных.
Да, все это делают, и я в том числе, но один раз и в конце программы.
sibrat
Вопрос прежде всего к vladisslav2011 наверное.
Да, я linux видел только на картинке, поэтому есть определённые сложности с терминологией и всем что написано выше.
Может ли upsample помочь расширить динамику и снизить потери?
Хороший вопрос. Нет, но будет казаться что может.
И тем больше будет казаться, чем хуже upsample реализована.
vladisslav2011
Если не сложно, окно Кайзера как реализовано?
Интересует реализация функции Бесселя. У меня вот так, и она мне не нравится. |
|
Дата: 22 Янв 2023 13:26:50
#
|
|
Дата: 22 Янв 2023 14:09:43 · Поправил: Programmist (22 Янв 2023 14:34:45)
#
vladisslav2011
sibrat
Написать мелкую программку
:-)
Если FIR 200 порядка оказывается быстрее FFT в 2 раза, то почему бы и нет.
Потому что все FIR-ы разные, и FFT разные. У меня не быстрей, может быть потому, что FFT быстрей в 2 раза.
И действительно, почему бы и нет, когда разницу всё равно никто не услышит.
А если услышит, то с FIR-ом оно даже на ламповое радио будет больше похоже.
реализация функции Бесселя
Не нашёл, ну ладно, все окна считаются один раз и на скорость не влияют. Оставлю как есть.
|
|
Дата: 22 Янв 2023 14:53:19
#
2017 год, не 2023, но и не 1985. Реализация на FPGA. Показано, что costas loop самый эффективный.
Жаль что Задорнов умер.
Если нужно будет 10..15 каналов и больше, то FFT здорово поднимет производительность.
Каналов чего? FFT это переоформленный DFT, какую производительность и где он подымит когда сам переход в частотную область там не к месту!?
Перед переходом к 8 бит отправкой в HackRF ресэмплировать до 16Msps например.
Зачем ресемплировать?
|
|
Дата: 22 Янв 2023 15:04:42
#
LFSR
Каналов чего?
Приёмников 10-15. Отсохнет процессор 3000 порядков крутить.
|
|
Дата: 22 Янв 2023 17:23:07
#
vladisslav2011
Или прогнать через AGC
Да, это работает. Правда я не сразу понял что после старта надо время на установку уровня. :)
Перед переходом к 8 бит отправкой в HackRF ресэмплировать до 16Msps например.
Это тоже работает. Только надо не upscale, а interpolator.
Спасибо за идею.
|
|
Дата: 22 Янв 2023 18:08:50 · Поправил: Programmist (22 Янв 2023 18:12:51)
#
vladisslav2011
https://github.com/gnuradio/gnuradio/blob/main/gr-fft/lib/window.cc#L232-L257
Внимательней с окнами, если окно Ханна зелёное, то код из приведённого выше модуля даёт красное:
А Кайзер там вообще не Кайзер, потому что нет Бесселя. |
|
Дата: 22 Янв 2023 18:20:26
#
Programmist
У меня Кайзер сделан тупо:
public static double kaiser_2(int i, int N, double alpha)
{
double x = 2.0 * i / N - 1;
x = 1 - x * x;
double arg_bottom = Math.PI * alpha;
double arg_top = arg_bottom * Math.Pow(x, 0.5);
return modified_bessel_first_kind_zero_order(arg_top) / modified_bessel_first_kind_zero_order(arg_bottom);
}
public static double modified_bessel_first_kind_zero_order(double z, int max_k = 12)
{
//максимум 12, т.к. факториал в квадрате иначе вылетает за long
double ret = 0;
for(int k = 0; k <= max_k; ++k)
{
long divider = factorial(k) * factorial(k);
double z_base = z * z * 0.25;
double top = Math.Pow(z_base, k);
ret = ret + top / divider;
}
return ret;
}
|
|
Дата: 22 Янв 2023 18:24:45 · Поправил: Programmist (22 Янв 2023 19:24:49)
#
wazzoo
У меня Кайзер сделан тупо
Бессель где? Результат его функции и сама функция.
В данном случае, это тоже не Кайзер.
Для рисования спектра может быть и сойдёт, для точных расчётов - нет.
//
Всё равно спасибо, это самое я давно искал. Значит всё-таки через factorial, забавно...
|
|
Дата: 22 Янв 2023 19:26:52 · Поправил: wazzoo (22 Янв 2023 19:35:00)
#
Programmist
Бессель где?
https://www.recordingblogs.com/wiki/kaiser-window
Не Бессель, а zero order modified Bessel function of the first kind - он тут - "modified_bessel_first_kind_zero_order"
для точных расчётов - нет.
Это как то абстрактно. Точность - она относительная, зависит от задачи. Что именно надо посчитать и с какой точностью?
Здесь все ограничено факториалом. До бесконечности вы его не рассчитаете. В моем коде до 12 считается.
The sum converges and we can be approximate for any x, if we take the first few terms
Надо ли больше - вот в чём вопрос, обычно надо скорее даже меньше. Если надо больше - надо считать хитрее, конечно, или искать таблицу готовых значений, если кто-то посчитал. А так - просто сравниваете сумму до 11 и сумму до 12 - и смотрите, в каком знаке отличие - и прикидываете, повлияет ли вообще на то что вы считаете |
|
Дата: 22 Янв 2023 19:37:56 · Поправил: Programmist (22 Янв 2023 19:45:54)
#
wazzoo
он тут - "modified_bessel_first_kind_zero_order"
Проверки требует... Выходит так, что всё это бред сумасшедшего.
Что именно надо посчитать и с какой точностью?
У меня интерполяция на основе этой функции построена.
повлияет ли вообще на то что вы считаете
Повлияет. 8 лет делал, пока не дошло, что sinc там как-то не очень подходит. |
|
Дата: 22 Янв 2023 19:49:46
#
Выходит так, что всё это бред сумасшедшего.
Ничего не могу сказать. Я писал свою функцию чисто взяв математику из статей про Kaiser window. Для примера я ссылку выше дал - там вся математика расписана.
Мне высокая точность не нужна (здесь её легко можно повысить просто отказавшись от расчета квадрата факториала), да и в целом окно Кайзера - оно было просто до кучи мимоходом добавлено самым тупым образом.
А так - потестировав, оказалось, что на моей задаче Казер не лучше остальных (у меня 13 окон на выбор), независимо от альфы. Лучшим оказался Парцен, и почти рядом с ним привычный Блэкман-Харрис.
интерполяция на основе этой функции построена.
Ну, не менее абстрактно. Зависит что и для чего интерполировать. Впрочем, не важно...
|
|
Дата: 22 Янв 2023 19:53:49 · Поправил: Programmist (22 Янв 2023 20:17:30)
#
wazzoo
в целом окно Кайзера - оно было просто до кучи мимоходом добавлено
Оно самое удобное, все остальные можно выбросить, если используется для вывода на экран спектра, а не для точного расчёта.
Ну, типа в качестве "показометра".
А так, в качестве стандарта использую Ханна, чтобы картинки везде были одинаковые.
И меньше непонятных ручек было крутить пользователю.
Ну, не менее абстрактно. Зависит что и для чего интерполировать. Впрочем, не важно...
Важно, sinc хороша для автоколебаний, а в природе никаких автоколебаний нет.
sibrat
Может ли upsample помочь расширить динамику и снизить потери?
Вот примерно так будет выглядеть более развёрнутый ответ на Ваш вопрос, за исключением снижения потерь, конечно.
|
|
Дата: 22 Янв 2023 20:46:19 · Поправил: wazzoo (22 Янв 2023 20:48:13)
#
Важно
Я про себя - мне не важно, что там за задача. Просто "интерполяция" - это такой же абстрактный разговор, как и "точность".
Оно самое удобное
Для чего удобное? Дольф-Чебышев тоже очень удобное, если надо задать уровень подавления боковых. Ну или флэттоп - тоже удобное, только уже для измерений. В общем, тут тоже все относительно. Не думаете же вы, что окон много просто от того, что людям делать было нечего.
|
|
Дата: 22 Янв 2023 21:00:15 · Поправил: Programmist (22 Янв 2023 21:18:06)
#
wazzoo
Просто "интерполяция" - это такой же абстрактный разговор, как и "точность".
Да.
Для чего удобное?
Для подбора функций. Крути одну ручку, и перекрывает почти весь набор окон и между ними, относительно, конечно.
Не думаете же вы, что окон много просто от того, что людям делать было нечего.
Не думаю. Для меня оконная функция одна из самых важных.
У самого 10, и это в версии для пользователя:
Попробуйте сделать перекрытие FFT с окном отличным от Ханна. Вот то-то и оно. |
|
Дата: 22 Янв 2023 21:47:15
#
Programmist
потому что нет Бесселя.
Так вот же как раз modified_bessel_first_kind_zero_order в строках 26-41
https://github.com/gnuradio/gnuradio/blob/main/gr-fft/lib/window.cc#L26-L41
Я специально вторую ссылку добавил, чтобы по коду не ползать, не искать. В GNU Radio практически все тоже написано по книгам/статья и в комментариях есть ссылки, откуда брались формулы.
LFSR
bPSK элементарно детектируется линией задержки
Не понял, как можно остановить вращение сигнального созвездия при неточной настройке и восстановить частоту символов линией задержки. Код/ссылку на статью пожалуйста.
какую производительность и где он подымит когда сам переход в частотную область там не к месту!?
Вы точно понимаете, что получается на выходе FFT?
Если мы настроимся на 446.0MHz, захватим сигнал на 5Msps, а потом захотим писать все PMR (8 или 16, сколько их там) каналы каждый в отдельный аудиофайл, то что будет быстрее: одно FFT + перенос спектра с используемых выходов на центральную частоту для демодуляции или выполнение 8...16 довольно тяжелых FIR с тем же результатом. Можно и на LPD точно так же логировать все каналы - там их больше и выигрыш от FFT будет уже на порядки относительно FIR.
Зачем ресемплировать?
Для уменьшения спуров и шума. И для того, чтобы можно было сдвинуть передаваемый спектр в сторону от центральной частоты и убрать DC peak по центру (привет, Glonass). DC peak можно потом убрать аналоговым полосовиком перед усилителем.
Programmist
код из приведённого выше модуля даёт красное
У вас тут off-by-one. Кодом из приведенного модуля посчитано окно шириной 17, а зеленый график - то же окно посчитанное шириной 16.
Значит всё-таки через factorial
В GNU Radio как-то попроще сделано, разложением в ряд и посчетом суммы членов ряда до тех пор, пока погрешность не будет меньше 1e-21. Надо проверить каким способом получается точнее.
для вывода на экран спектра
Вабор окна все-таки нужен. Хотя бы flattop и blackman-harris или kaiser, так как может быть нужно высокое разрешение по частоте, а может быть нужно точное определение амплитуды. |
|
Дата: 22 Янв 2023 22:03:00 · Поправил: Programmist (22 Янв 2023 22:08:17)
#
vladisslav2011
modified_bessel_first_kind_zero_order
Спасибо, разобрался уже, но имхо это не Бессель, проверки требует.
Я специально вторую ссылку добавил, чтобы по коду не ползать, не искать.
А я и не понял, у меня браузер старый, там всё едино.
Кодом из приведенного модуля посчитано окно шириной 17, а зеленый график - то же окно посчитанное шириной 16.
Вот код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var n, j, ASize : LongInt;
w, M : Double;
Q1, Q2 : Array of Double;
begin
ClearSeries;
ASize:= 16;
SetLength(q2, ASize);
SetLength(q1, ASize);
j := ASize - 1;
M := ASize - 1;
for n:= 0 to j do
begin
w := n / ASize;
Q2[n] := 0.5 - 0.5 * Cos(2 * Pi * w); // зелёное
Q1[n] := 0.5 - 0.5 * cos((2 * Pi * n) / M); // красное
end;
Series1.AddArray(Q2);
Series2.AddArray(Q1);
end;
Оба 16, красное (Q1) - Ваше.
|
Реклама Google |
|