Автор |
Сообщение |
|
Дата: 23 Янв 2023 22:45:04
#
FFT только позволит увеличить производительность в несколько раз.
Производительность ЧЕГО!? UP/DWN конвертера!? Так ему нахер не надо переход в частотную область. И что Вы придолбались к тем FIR-ам? Они там тоже нафиг не нужны.
Предолжите свой вариант, который реализует сравнимую производительность.
5Msps IQ на входе, 10 полос по ~10kHz на 12.5ksps на выходе с тестами производительности.
Даже не знаю что сказать. Ведь это даже в чем-то подвиг - бросив школу в раннем детстве, Вы, видимо, таки выучились читать и даже набрасывать функции на C. Но это как Касперу Хаузеру рассказывать о перспективе при попытке передачи грандиозности Большого Каньона в художественном наброске.
Включая бесконечное множество томов с математикой.
Йопта...
|
|
Дата: 23 Янв 2023 22:48:40
#
vladisslav2011
Математика от этого не меняется
Получилось подключить мой модуль FFT в свой проект и сравнить скорость работы? Вот так.
А математика одна. Так же и у меня нет возможности переводить с других языков, в чём недавно сами убедились.
Мне и в голову не могло прийти, что размер массива 16 на C может иметь значение 15, или хуже того 15++.)
|
Реклама Google
|
|
|
Дата: 23 Янв 2023 23:15:33 · Поправил: vladisslav2011 (23 Янв 2023 23:22:33)
#
LFSR
Производительность ЧЕГО!?
Производительность channelizer (не знаю, как это просто сказать по русски, каналообразующий фильтр может быть).
Преобразование потока IQ в формате например std::complex<float> 5msps в 10 потоков IQ в формате std::complex<float> 12.5ksps, каждый на своей центральной частоте. Полоса каждого потока на выходе ~10kHz, подавление внеполосных сигналов пусть будет хотя бы 60db. Реализуйте это для примера. Ввод/вывод IQ файлы, GUI не нужно.
Так ему нахер не надо переход в частотную область
Там нет перехода в частотную область. Переход в частотную область и фильтрация в ней предлагается Programmist, но это не лучший вариант. Читайте книги.
Даже не знаю что сказать.
Пффф. Меня толстотроллить бесполезно. Сам такой. Регулярно монитор от жира оттираю. :-)
Ну, да. Пару функций на C(с плюсами) могу набросать
https://github.com/vladisslav2011/gqrx/tree/fft_channelizer
Добавляем штук 10 демодуляторов (shift+left click как в cubic SDR) и сравниваем загрузку процессора переключая указанный combo box с "off" на "single threaded" и обратно.
Если вы любезно предложите свою реализацию многоканального приемника, которая будет быстрее, включу в свою ветку с указанием вашего копирайта.
Programmist
Получилось подключить мой модуль FFT в свой проект и сравнить скорость работы?
Зачем. Оно же не особо лучше FIR по производительности.
Мне и в голову не могло прийти, что размер массива 16 на C может иметь значение 15, или хуже того 15++.)
Нет. sizeof(char[16])==16
Но циклы for в C/C++ реализованы более гибко, чем в паскале - можно указывать любое выражение как в инициализации, так и в тесте, и в инкременте. |
|
Дата: 23 Янв 2023 23:19:12 · Поправил: Programmist (24 Янв 2023 01:12:49)
#
LFSR
Производительность ЧЕГО!? UP/DWN конвертера!? Так ему нахер не надо переход в частотную область. И что Вы придолбались к тем FIR-ам? Они там тоже нафиг не нужны.
Конечно, не нужны.
А ну попробуйте сделать простейший DWN конвертер без FIR-а, выбросив половину отсчётов, что получится?
Или думаете что свёрточный sinc во временном домене за вас всё сделает? Да как бы не так.
vladisslav2011
Зачем. Оно же не особо лучше FIR по производительности.
Как это зачем, да хоть для вывода спектра на экран.
Но если не интересует разница в производительности по сравнению с модулями, сделанными на языке высокого уровня, тогда и не надо.
Опять же от верных инструкций процессору много зависит, за четверть века кучу новых добавили.
циклы for в C/C++ реализованы более гибко
Вот и я говорю, правильный выбор языка может изменить всю жизнь.)
Переход в частотную область и фильтрация в ней предлагается Programmist, но это не лучший вариант.
Лучший. И в частотной области надо делать всё, а не городить огород, половина в частотной, половина в не частотной.
Если за один цикл FFT получится все необходимые операции сделать, вообще сказка будет.
Крайний проект у меня именно так и реализован.
В Windows есть такая полезная вещь, как очередь сообщений.
Вот этими сообщениями и можно разбрасывать буфера, какой на экран, какой на динамик, какой ещё куда.
Система сама всё сделает и тормозить не будет.
|
|
Дата: 24 Янв 2023 01:18:19 · Поправил: vladisslav2011 (24 Янв 2023 01:21:46)
#
Programmist
Как это зачем, да хоть для вывода спектра на экран.
Я обычно смотрю спектр шириной от 128k до 512k, иногда ставлю 1M - с RX888 имеет смысл.
А эта реализация максимум 64k.
Но если не интересует разница в производительности по сравнению
Интересует, во сколько раз эта реализация будет медленнее libFFTW.
Попробовал собрать - оно даже почти скомпилировалось, но 32битный ассемблер на 64битной системе не компилируется никак, а переписывать весь ассемблер руками на 64 бита мне как-то не особо хочется.
Может попробую еще под ubuntu 16.04 i686 в chroot - должно собраться по идее.
Если за один цикл FFT получится все необходимые операции сделать
Только первоначальную фильтрацию+децимацию, потом все равно фильтровать пользовательским фильтром, подстраивать частоту, демодулировать и так далее.
В Windows есть такая полезная вещь, как очередь сообщений.
В Qt тоже есть, но vmcircbuf из GNU Radio уделывает все, что я видел ранее по производительности, используя MMU правильным способом.
|
|
Дата: 24 Янв 2023 03:57:42
#
vladisslav2011
но 32битный ассемблер на 64битной системе не компилируется никак
прекрасно он компилируется - надо просто освоить/настроить тулчейн сборки alien архитектуры. точно так же как собираются бинарники под arm и stm, а вы, наверное, пытались нативным методом..
Но да, в 32битном чруте может оказаться проще ;)
|
|
Дата: 24 Янв 2023 11:53:48 · Поправил: Programmist (24 Янв 2023 12:01:59)
#
vladisslav2011
переписывать весь ассемблер руками на 64 бита мне как-то не особо хочется
Да, проблема, есть Delphi 64, но в проекте половина ассемблер, переписать весь у меня ума не хватит.
А переписать на высоком уровне, проект встанет колом и никакого процессора не хватит.
sibrat
прекрасно он компилируется - надо просто освоить/настроить тулчейн сборки alien архитектуры.
Вот это уже интересно, может и в Delphi / Lazarus такая настройка есть?
|
|
Дата: 24 Янв 2023 12:25:39
#
|
|
Дата: 24 Янв 2023 12:30:09 · Поправил: Programmist (24 Янв 2023 13:05:07)
#
sibrat
предлагаете мне за вас гуглить? :)
Не предлагаю, просто подумал вслух.)
У меня всё равно система 32 бита.
А все проекты с кучей "бубнов", не как у людей.
Даже квадратный корень по своей формуле считается:
function FastSqrt(const X: Single; Ni : LongInt): Single;
var ResultAsInt: LongInt absolute Result;
begin
Result := X;
ResultAsInt := $5F3759DF - (ResultAsInt shr 1);
Result := Result * ( 1.5 - (X * 0.5 * Result * Result)); // 1st iteration
if Ni >= 2 then Result := Result * ( 1.5 - (X * 0.5 * Result * Result)); // 2nd iteration
if Ni >= 3 then Result := Result * ( 1.5 - (X * 0.5 * Result * Result)); // 3rd iteration
Result := Result * X;
end;
Как можно заметить, корня там нет, а это ну очень сильно снижает нагрузку на микропроцессор.
И легко гуглится, по ключевому слову $5F3759DF :)
|
|
Дата: 24 Янв 2023 13:32:23 · Поправил: Programmist (24 Янв 2023 20:00:19)
#
sibrat
ещё есть dithering...
Так и быть, покажу один пример (Windows):
http://www.radioscanner.ru/uploader/2022/e-pcm.rar
И передавайте по сети 32 бита как 16, навсегда забыв про такую глупость как dithering.
Серьёзная тема, кстати, для конструкторов SDR и не только.
Если бы она возникла на заре конструирования компакт-дисков, меньше было бы разговоров про различие цифры и аналога.
Не хотел показывать, ввиду того что здесь пастбище супостатов, ну да ладно, им до всего что есть ещё 300 лет гранит науки пилить.
И всё равно ни хрена не выйдет. |
|
Дата: 24 Янв 2023 18:22:08
#
Так ничего не получится. Читайте методички, которые тут выложили. Много думайте
Можете указать на методички, прошерстил тему - не вижу методичек.
|
|
Дата: 24 Янв 2023 18:27:09 · Поправил: Programmist (24 Янв 2023 18:33:21)
#
|
|
Дата: 24 Янв 2023 20:49:45
#
Делаю FFT каждых N семплов (1 FFT для I, 1 FFT для Q)
IQ нельзя разделять. У вас зеркалки вылезут. Читайте методички.
Так, чё-то я школу прогуливал похоже. А верно ведь, что "обычный" FFT (DFT) на вход получает комплексные числа?
Если я когда-то вычислял FFT аудиосигнала с микрофона - это на самом деле было вычисление над входным комплексным сигналом, у которого Imaginary-часть была нулевая?
Если так, тогда I и Q разделять тупо конечно, они без изменений идут на вход FFT.
|
|
Дата: 24 Янв 2023 20:57:00 · Поправил: Programmist (24 Янв 2023 20:57:58)
#
pavelkolodin
верно ведь, что "обычный" FFT (DFT) на вход получает комплексные числа?
Верно, Image часть нулевая.
тогда I и Q разделять тупо конечно, они без изменений идут на вход FFT.
I и Q это не Image и Real части, если подать их на вход FFT получится чёрт-те что.
|
|
Дата: 24 Янв 2023 21:24:47
#
I и Q это не Image и Real части, если подать их на вход FFT получится чёрт-те что.
Чей-то. Именно так и подавать.
|
|
Дата: 24 Янв 2023 21:30:17
#
wazzoo
Именно так и подавать.
Стесняюсь спросить - зачем? Что будет на выходе?
|
|
Дата: 24 Янв 2023 21:31:32 · Поправил: wazzoo (24 Янв 2023 21:33:40)
#
Что будет на выходе?
То же, что вы получите, прогнав по отдельности I и Q - частотная область IQ сигнала
Напомню, что FFT(I + j*Q) = FFT(I) + j*FFT(Q)
|
|
Дата: 24 Янв 2023 21:34:07
#
Смысл этой операции не понятен, ну ладно, может чего пропустил.
|
|
Дата: 24 Янв 2023 21:35:07 · Поправил: wazzoo (24 Янв 2023 21:38:28)
#
Смысл этой операции не понятен
Что именно не понятно? Смысл перевода из временной в частотную? Можно спектр нарисовать, измерить что-то. Ну или тут как я понял предлагают нарезать на каналы исходный широкополосный сигнал - применив доп.манипуляции.
Встречный вопрос. А для чего вы используете FFT?
|
|
Дата: 24 Янв 2023 21:40:02 · Поправил: Programmist (24 Янв 2023 21:43:21)
#
wazzoo
Что именно не понятно?
Не понятно, что с этим дальше делать, реальный сигнал таким образом не получают.
А для чего вы используете FFT?
Для всего, но для работы с реальным сигналом, а не с I и Q.
|
|
Дата: 24 Янв 2023 21:40:08
#
I и Q это не Image и Real части, если подать их на вход FFT получится чёрт-те что.
А как тогда предлагалось использовать "комплексный FFT" и "не отделять I от Q"?
|
|
Дата: 24 Янв 2023 21:44:33 · Поправил: pavelkolodin (24 Янв 2023 21:46:22)
#
Не понятно, что с этим дальше делать, реальный сигнал таким образом не получают.
Так и нет задачи получить реальный сигнал, реальный - это только после демодуляции IQ-демодулятором каким-то. IQ тоже не является никаким реальным. Задача же была в фильтрации. Я хочу из широкополосного IQ нарезать подканалы с тем же IQ. Он как не был реальным, так и не будет, я просто нарублю подканалы и дальше уже буду что-то там демодулировать в них, получая "реальный".
FFT ведь математически на вход требует комплексный сигнал - ему не очень важно что этот комплексный сигнал "репрезентует". FFT просто вам гарантирует, что он умеет гонять этот комплексный сигнал в частотный домен (такой же комплексный) и обратно.
|
|
Дата: 24 Янв 2023 21:45:37 · Поправил: Programmist (24 Янв 2023 21:48:39)
#
Мне вообще I и Q не нужен, если попадает, первым делом превращаю его в реальный, да с помощью FFT.
Да, что-то пропустил, если надо и дальше работать с I/Q, никто не запретит это делать.
|
|
Дата: 24 Янв 2023 21:47:27 · Поправил: wazzoo (24 Янв 2023 21:50:46)
#
что с этим дальше делать
Ну смотрите - у вас в результате FFT получается частотная область IQ. Т.е. в каждом бине информация об уровне сигнала на частоте, которой этот бин соответствует. Ессно с заползанием информации из соседних бинов. Насколько сильно и как будет эта инфа заползать - определяется оконной функцией.
Что дальше делать с частотной областью - ну типичное применение - нарисовать спектр. Т.е. вы можете вычислить мощность сигнала в каждом бине (сумма квадратов I и Q) и дальше отрисовать это как вам удобно.
В этой же теме, если я правильно понял (могу ошибаться) - предлагается таким макаром нарезать исходную широкую полосу на набор узких - переведя сигнал в частотную область, потом побив частотную область на кусочки, перегнав обратно во временную область каждый отдельный кусочек и применив доп.фильтрацию, чтобы сильнее убрать влияние соседних бинов. Поправьте, если неправильно понял идею...
|
|
Дата: 24 Янв 2023 21:47:42 · Поправил: pavelkolodin (24 Янв 2023 21:56:34)
#
Мне вообще I и Q не нужен, если попадает, первым делом превращаю его в реальный, да с помощью FFT.
А мне нужен - он прикольный. Позволяет FM-демодулятор в две строчки писать, выдавая семплы демодулированного сигнала как значения производной угла, который (угол) весьма однозначно задаётся I/Q-семплами. С I/Q я вижу куда угол крутится - по часовой или против часовой, а с реальным сигналом я вижу только проекцию вращения на одну из плоскостей. Условно, если я вижу ноль, то я вижу что вектор смотрел перпендикулярно на ось проекции, но в какую сторону он смотрел - в меня или то меня - не вижу уже. Хотя по предыдущим значениям вектора можно понять, куда он крутился, но это надо алгоритм писать, а в I/Q информация в сыром виде готовая лежит. Я так это понимаю на своём тупом уровне.
Опять же, SDR-приёмники отдают I/Q с тем умыслом, что их local oscillator работал в середине полосы, которую вы наблюдаете. То есть, вам надо ещё отрицательные частоты от положительных как-то отличать, что с I/Q реализуемо. Я тут видел код рисовалки водопада I/Q сигнала - чуваки просто в fft загоняют I + Q: питонячий код:
// в буфере s0 семплы I и Q лежат поочерёдно
// буфер "реальных" чередующихся I и Q s0 преобразуется в "s" - буфер комплексных.
// и этот буфер комплексных - хоба сразу в fft пихают.
s = (s0[::2] + 1j*s0[1::2])
S = np.fft.fftshift(np.fft.fft(s, self.N) / self.N)
// результат для рисования нормируется:
20*np.log10(np.abs(S))
|
|
Дата: 24 Янв 2023 21:49:24
#
|
|
Дата: 24 Янв 2023 21:52:26 · Поправил: Programmist (24 Янв 2023 21:55:09)
#
Понятно. Да, с I/Q работать проще, для того он и существует, но я делал иначе.
Здесь наверно следует уточнить, что у меня другое железо, и никаких I/Q там в принципе нет.
|
|
Дата: 24 Янв 2023 21:54:38 · Поправил: wazzoo (24 Янв 2023 21:55:16)
#
pavelkolodin
Я кстати даже в аудиоредакторе встречал такой тип фильтра/эквалайзера - FFT. Думаю, он именно так и работает - просто в интерфейсе пользователем рисуется нужная кривая АЧХ, исходный сигнал загоняется в частотную область, бины умножают на коэффициенты АЧХ, после чего перегоняется все обратно во временную область - и готово
Конечно, там нет IQ - но суть то та же.
|
|
Дата: 24 Янв 2023 22:00:05
#
wazzoo
Конечно, там нет IQ - но суть то та же.
Поэтому я и советовал, прежде всего, выводить все результаты на экран, иначе крутить можно до бесконечности.
|
|
Дата: 24 Янв 2023 22:00:19 · Поправил: pavelkolodin (24 Янв 2023 22:04:16)
#
pavelkolodin
Я кстати даже в аудиоредакторе встречал такой тип фильтра/эквалайзера - FFT. Думаю, он именно так и работает - просто в интерфейсе пользователем рисуется нужная кривая АЧХ, исходный сигнал загоняется в частотную область, бины умножают на коэффициенты АЧХ, после чего перегоняется все обратно во временную область - и готово
Конечно, там нет IQ - но суть то та же.
Аудиоредактор я когда-то свой писал: https://audigger.sourceforge.net/ru/
Исходники остались, надо будет как-то возобновить проект: https://github.com/pavelkolodin/audigger присобачив заодно поддержку SDRPlay сразу. Мне в какой-то момент надоел Qt5, захотелось на что-то легковесное отрефакторить, забив на поддержку винды.
Баловался с такими приколами тоже: выделяешь двумерным маркером кусок сигнала на водопаде: по времени и частоте. Оно идёт в FFT-спектр, зануляет выделенные бины, делает IFFT и замещает кусок сигнала - получалась рабочая фильтрация, можно было свисты-скрипы в звуке вырезать прицельно. Я тогда забросил вопрос аккуратности работы этого фильтра и артефактов склейки (на спектре появлялись всякие дикие полоски в местах состыковок), но принципиально это работало. Ну и обратно: рисуешь карандашом на спектре линии, оно их обратно в звук загоняет. Ясное дело, ничего приятного на слух так нарисовать невозможно (или надо долго тренироваться + разбираться с антиалиасингом, а не умножать бины FFT на бинарные значения 1 или 0).
Я просто запутался в комплексном матане всего этого FFT-вопроса и в соотнесении его с I/Q-сигналами. |
Реклама Google |
|