Автор |
Сообщение |
|
Дата: 13 Дек 2011 01:26:57 · Поправил: RadioKoteg (13 Дек 2011 01:53:54)
#
|
|
Дата: 13 Дек 2011 01:51:43 · Поправил: Programmist (13 Дек 2011 03:11:55)
#
RadioKoteg
Снос плохо работает и потери качества все равно есть. Скоро положу версию, где потерь нет. Она уже готова, но там проблема с дурацким 24-х битным форматом, при сохранении больших файлов.
|
Реклама Google
|
|
|
Дата: 13 Дек 2011 02:23:14
#
Кажется работает, "переконвертил" все что было под руками. Скорость работы ну то пока не обсуждаю потому что не с чем сравнивать.
Programmist IMHO можно добавить сохранение картинки спектра.
Думаю что будущем можно добавить туда АМ и ЧМ детекторы, "дядьки-тетьки" они говорят а о чем не слышно окромя как в SSB. Хотя это можно другой программой делать..
|
|
Дата: 13 Дек 2011 02:35:59
#
RadioKoteg
можно добавить сохранение картинки спектра.
Это там есть - кнопка с фотоаппаратом, в правом верхнем углу. Седьмая версия хоть и без потерь, но ее потом надо выбросить, много ошибок.
|
|
Дата: 13 Дек 2011 03:06:23
#
|
|
Дата: 13 Дек 2011 03:11:23 · Поправил: Programmist (13 Дек 2011 03:17:10)
#
RadioKoteg
А шкалу можно? Время и Герцы?
Конечно можно, это проще всего и не интересно, поэтому и нет пока :)
Заложено в эту прогу возможностей много, главное все правильно расписать.
Семерку удаляю, там с ней еще работать надо.
з.ы.
А спектр 30Мб красивый :)
|
|
Дата: 13 Дек 2011 03:32:59
#
Programmist я вас понял.
|
|
Дата: 13 Дек 2011 09:48:54 · Поправил: Programmist (13 Дек 2011 17:36:05)
#
Вот 32 бита "бесконечный" конвертер:
http://www.radioscanner.ru/files/recording/file12938/
Перенес его сюда, чтобы можно было обновлять. Текущая демо-версия - 09.
Можно сказать, что сейчас качество конвертера хорошее, понимает форматы 8, 16, 24 и 32 бита.
Максимальный размер файла не проверял, но думаю, что более сотни метров (дальше возможны глюки).
Файлы, формат которых не удалось определить, читаются и сохраняются, как 16-ти битные wav-ы.
Думаю что будущем можно добавить туда АМ и ЧМ детекторы, "дядьки-тетьки"
Пока не надоело, буду пилить дальше, она золотая, может быть и до этого дойдем :)
Важный момент! Перед сохранением файла, если амплитуда горит красным, необходима нормализация.
Принимаются все предложения по усовершенствованию. |
|
Дата: 14 Дек 2011 02:24:44 · Поправил: Sinus (14 Дек 2011 02:25:54)
#
|
|
Дата: 14 Дек 2011 02:48:37
#
petr0v
для блока длиной в степень двойки преобразование из IQ в реальный сигнал по вашему алгоритму идеальное или нет? Какой на счёт этого вывод?
Раньше ответил, будто идеальное. Теперь вношу поправку. Численная проверка (точная, без квантования уровней) показала, что при ранее указанном мной IQ -->R веществ. сигнал S(n) восстанавливается не точно: чётные-то отсчёты S(0), S(2), ... воспроизводятся хорошо (с погрешностью маткадного FFT-IFFT), а вот нечётные гораздо хуже.
Причина мне известна. Те формулы точны лишь в пределе бесконечного числа отсчётов N, (плюс условие ограниченности спектра). Т.е. я там поленился аккуратно учесть конечность N. Но в одном из постов упомянул о возможности "мелкого усовершенствования" :-)
Вот оно: при конечном N сформированные там при R --> IQ фурье-амплитуды B(k) надо домножать на фазовый множитель exp(i2пи*k/N). При восстановлении же (IQ --> R) результат IFFT(B) надо домножать на обратной множитель, exp(-i2пи*k/N), и лишь после этого использовать в качестве фурье-амплитуд B(k). Тогда пр-е туда-обратно становится идеальным - в том смысле, что исходный веществ. сигнал воспроизводится с точностью машинного FFT-IFFT.
Как же выглядят эти процедуры во временном домене? Такое пр-е R --> IQ методом FFT точно соответствует умножению отсчётов S(n) на комплексную синусоиду с частотой - Fdiscr / 4, то есть на exp(-i2пи*n/4) = (-i)n. Затем из полученного компл. сигнала U(n) = S(n)(-i)n выделяются вещ. A(n) и мнимая B(n) части по формуле: U = (1/2)(A +iB). И, наконец (перед записью в 2-канальный вав с пониженной вдвое частотой дискр.) они децимируются вдвое.
Как децимируются - полезно взглянуть Programmistу, чтобы осознать "магию" мнимой единицы i. Когда n пробегает значения 0, 1, 2, 3, 4, ... , множитель (-i)n принимает значения 1, -i, -1, i, 1, (далее всё повторяется). Поэтому страшные слова "умножить S(n) на комплексную синусоиду с частотой - Fdiscr / 4 и выделить Re и Im части" означают здесь простое дело - составить две последовательности:
S(0), 0, -S(2), 0, S(4), 0, -S(6), 0, ... (последний, N-1 ый элемент, будет ноль, так как у нас N есть степень двойки);
0, -S(1), 0, S(3), 0, -S(5), 0, S(7), ... (последним будет отсчёт S(N-1)).
Децимация означает - отбросить здесь нули. Эти укоротившиеся вдвое массивы и есть наши два канала I/Q. Такое преобразование R --> IQ эквивалентно нашим громоздким "спектральным играм" (надеюсь, не ошибся в математич. доказательстве этого факта )). Обратное пр-е, IQ -->R, сводится к компоновке из указанных двух массивов единого массива S(0), S(1), S(2), ,,, S(N-1).
Programmist: Принимаются все предложения по усовершенствованию. Вот, можно испытать указанное предложение.
petr0v
Вы на самом деле делаете две операции. Интерполяцию в два раза чтобы полосовой сигнал был представим в действительном виде и перенос спектра. Если теперь правильно понимаю, интерполяция при IQ -->R состоит в добавлении нулей между отсчётами в последовательностях I, Q, которые затем складываются (при нужном изменении знаков). Но не вижу, где тут может произойти "порча" спектра... И смущён отсутствием фильтрации, так как в "фирменных" конверторах она, вроде бы, есть, раз видна задержка выходного сигнала. А тут всё должно восстанавливаться идеально, без всяких задержек... - я проверил это всё на той же синусоиде аккурат между бинами.
|
|
Дата: 14 Дек 2011 03:16:33 · Поправил: Programmist (14 Дек 2011 10:31:17)
#
Sinus
До конца тоже не разобрался, очень смущают частоты Найквиста, прямое-обратное преобразование работает идеально, но при децимации с ними надо что-то решать, иначе падает точность.
Пока привожу в порядок работу с форматами, 24 бита уже сделал нормально, остался 8-ми битный формат, в нем все значения положительные 0-255. Не могу найти середину :)
В Куле этот вопрос решен интересно - середины нет. Нормализованный до нуля сигнал - это шум между значениями амплитуды 127 и 128.
з.ы.
Программу обновил до 10-ой версии. Показывает частоту и время. Добавил режекторный фильтр и еще что-то.
Есть выбор формата для сохранения и чтения, куча "пипеток" из фотошопа, для "захвата" частоты. Не знаю, насколько это удобно, время покажет.
|
|
Дата: 14 Дек 2011 10:23:20 · Поправил: mikasa76 (14 Дек 2011 10:28:46)
#
|
|
Дата: 14 Дек 2011 10:34:40
#
mikasa76
вариант преобразованного
Спектр перевернут, а так похоже.
|
|
Дата: 14 Дек 2011 10:45:28
#
Programmist Да, в исходном файле Sinus имеется реверс квадратур (инверсия спектра), у меня прямая последовательность )))
|
|
Дата: 14 Дек 2011 10:51:45 · Поправил: Programmist (14 Дек 2011 11:05:50)
#
Точно не известно, где верх, где низ, нужен нормальный тестовый сигнал, а пока тут одни самоделки :)
Прогу еще раз обновил, как всегда, забыл про деление на 0, при ручном вводе амплитуды.
Диапазон там огромный, можно задать несколько тысячных процента, потом восстановить, качество не падает. 32 бита рулят.
|
|
Дата: 14 Дек 2011 13:32:17
#
mikasa76, спасибо, вечером с великим интересом посмотрю Ваш результат преобразования 3 АМ )). Сейчас - на работе, почти нет возможности...
Да, реверс квадратур в моём файле сделан сознательно, и в названии файла это отражено: iq=BA, то есть в канал I записан массив B (мнимая часть комплексного сигнала), в канал Q - массив A (вещественная часть). Правда, тогда я наугад решил, что в канал 0 wav-файла пишется I, а в канал 1 пришется Q. Конечно, нет проблемы при записи или после чтения поменять их местами ))
Programmist
работает идеально, но при децимации с ними надо что-то решать, иначе падает точность.
Не идеально. Идеальнее будет с фазовым множителем exp(i2пи*k/N) для фурье-амплитуд B(k). Но Вы с ним не связывайтесь, если у Вас по-прежнему нету i в компьютере. )) Лучше попробуйте спрограммировать конвертеры туда-обратно, исходя из предположения, что:
канал I (в Ваших терминах ArrayA) это отсчёты S(0), -S(2), S(4), -S(6), ...
канал Q (в Ваших терминах ArrayB) это отсчёты -S(1), S(3), -S(5), S(7), ...
Real-сигнал (Ваш ArrayS) это отсчёты S(0), S(1), S(2), S(3), S(4), S(5), S(6), S(7)... ,
где S(n) это отсчёт сигнала в n-ый момент времени t = n / Fdiscr.
Так на данный момент понимаю картину, но ещё не успел её проверить на всех примерах )).
|
|
Дата: 14 Дек 2011 13:53:42
#
Sinus ок, спасибо. Конечно, нет проблемы при записи или после чтения поменять их местами )) согласен, этот вариант тоже нужно учитывать. сегодня/завтра попробую добить обратный конвертер (I/Q --> Real), упакую это все хозяйство в dll и выложу. )))))
|
|
Дата: 14 Дек 2011 14:32:27
#
Sinus
Если теперь правильно понимаю, интерполяция при IQ -->R состоит в добавлении нулей между отсчётами в последовательностях I, Q, которые затем складываются (при нужном изменении знаков). Но не вижу, где тут может произойти "порча" спектра... И смущён отсутствием фильтрации, так как в "фирменных" конверторах она, вроде бы, есть, раз видна задержка выходного сигнала.
Да во временной области добавляем нули между отсчётами, а потом обязательная фильтрация ФНЧ, затем умножаем на комплексную синусоиду и берём действительную часть. Вам нужно понять что то как вы делаете фильтрацию с помощью FFT фильтрацией не является, в результате получаются спектральные наложения. Фильтрация блока длиной N1 отсчётов с помощью фильтра с ИХ длиной N2 отсчётов с помощью FFT делается так:
дополняем блоки данных и фильтра нулями до длины N1+N2-1, делаем FFT дополненных блоков, перемножаем результаты FFT, делаем iFFT. Ничего нового тут нету, всё это описано во всех классических книжках по ЦОС. Выводы делать рано пока это не освоите, никакого идеала в неправильном применении FFT нет и быть не может.
|
|
Дата: 14 Дек 2011 15:45:35
#
petr0v, спасибо, буду это додумывать.
Конечно же в книгах всё давно есть. И знаю, что свёртку блока данных с ИХ фильтра быстрее делать в частотном домене - как перемножение фурье-образов с последующим обратным пр-ем Фурье.
Но сама необходимость фильтрации мне не очевидна (подчеркну - это впечатление дилетанта в ЦОС)), если всего-то требуется сдвинуть вдоль оси частот всю цепочку фурье-амплитуд вместе со всеми их бесконечными репликами.
Возможно, подводит некоторый навык мыслить понятиями непрерывного пр-я Фурье - с непрерывными временем-частотой (в физике это обычное дело, никаких спектральных наложений или иных "граблей" там нет). К тому же, привык считать, что если отображение обратимо, то оно безопасно - действия с образами эквивалентны действиям с оригиналами. И думал, если спектральное наложение - это необратимое изменение, то появиться оно может только в необратимой процедуре.
Значит, дискретному FT придётся учиться заново - самостоятельно вывести (чтобы понять) теоремы ЦОС, разобрать характерные примеры, чтобы в них видеть и предвидеть спектральные наложения, о которых Вы говорите, научиться оценивать их масштаб. Это хорошо, учиться люблю :)
|
|
Дата: 14 Дек 2011 16:28:54 · Поправил: mikasa76 (14 Дек 2011 16:31:59)
#
Sinus добавил у себя обратный конвертер IQ --> Real с обработкой опять таки во временном домене. алгоритм простой и в точности такой как описал Петров. вот пример конверта:
Ваш файл с тремя АМ:
test-1__iq=BA_3_AM-signals_iq-Fd=512kHz.wav
и мой вариант преобразованного (предварительно в Вашем исходном файле реверснул квадратуры):
test-1__real=AB_3_AM-signals_iq-Fd=1024kHz_iq2r.wav
который практически (незначительное снижение С/Ш за счет интерполяции) совпадает с Вашим же исходным моно вариантом:
test-1__mono_3_AM-signals_Fd=1024kHz.wav
И знаю, что свёртку блока данных с ИХ фильтра быстрее делать в частотном домене - как перемножение фурье-образов с последующим обратным пр-ем Фурье. А вот это под большим вопросом, что быстрее в итоге.
Но сама необходимость фильтрации мне не очевидна (подчеркну - это впечатление дилетанта в ЦОС)), если всего-то требуется сдвинуть вдоль оси частот всю цепочку фурье-амплитуд вместе со всеми их бесконечными репликами. При любом ресамплинге фильтрация обязательна, как при переходе IQ --> Real, так и обратно. |
|
Дата: 14 Дек 2011 17:06:12
#
Sinus
плюс условие ограниченности спектра
А откуда возьмётся это условие? Вы же беря блок умножаете во времени сигнал на прямоугольный импульс, делая тем самым спектр неограниченным.
|
|
Дата: 14 Дек 2011 20:08:50 · Поправил: Programmist (14 Дек 2011 21:23:19)
#
Sinus
канал I (в Ваших терминах ArrayA) это отсчёты S(0), -S(2), S(4), -S(6), ...
канал Q (в Ваших терминах ArrayB) это отсчёты -S(1), S(3), -S(5), S(7), ...
Real-сигнал (Ваш ArrayS) это отсчёты S(0), S(1), S(2), S(3), S(4), S(5), S(6), S(7)... ,
Проверю, если это так, тогда придется выбросить компилятор :))
з.ы.
Нет, не получиться, имхо это слишком просто. Вот результат: http://www.radioscanner.ru/uploader/2011/iq2rtestfiles.rar
mikasa76
упакую это все хозяйство в dll и выложу
Так понимаю, что все хозяйство написано на C++ ? |
|
Дата: 14 Дек 2011 21:45:26 · Поправил: Sinus (14 Дек 2011 21:52:11)
#
mikasa76, petr0v, Programmist
Спасибо, файлы скачал, неспеша рассмотрю и осмыслю всё вами сказанное. Беру тайм-аут на чтение-самообразование, раздумья и тесты-проверки... )
|
|
Дата: 14 Дек 2011 21:48:51 · Поправил: Mesh (14 Дек 2011 21:51:28)
#
Sinus Значит, дискретному FT придётся учиться заново Имхо, вы и так тут неплохо так сказать несётесь вперёд. В отличии от некоторых, пальцем тыкать не буду. ;) Собсно нужно просто вьехать, что что угодно куда угодно и как угодно не двигается не переносится, усё имеет разумные рамки и естественные ограничивания. Нуно просто мыслить в этих рамках и собсно работать с учётом этих ограничиваний, через какое-то время всё устаканится, и будет и у вас "шерсть дыбом" вставать когда "откровения" читать будете, "типо 16 бит мастадй, гиги в жипеге рулез, у мя лучшее разарешение что есь в мире, тока не знаю нах оно нуно" ;-)
|
|
Дата: 14 Дек 2011 22:01:08
#
Mesh, да, понятно. Но всегда есть что-то более очевидное, а что-то менее. Отдельные факты я уже вывел и на примерах проверил, а о других пока ещё сужу интуитивно... надо дальше учиться.))
|
|
Дата: 14 Дек 2011 22:03:23
#
Programmist Так понимаю, что все хозяйство написано на C++ ? ага, Intel C++ Compiler + IPP (Integrated Performance Primitives)
|
|
Дата: 14 Дек 2011 22:11:15
#
Sinus Блин, критичиски своё перечитал, хреново выразился. :-) Типо всё украдено до нас, и даже и не думайте чего новогу узнать, типо тупо повторяйте. Нет ессно я не про это. Ну да ладно, имхо вы поняли как наддо.
|
|
Дата: 15 Дек 2011 00:00:44
#
mikasa76
А вот это под большим вопросом, что быстрее в итоге.
Это точно, сделал фильтр высокого качества, но цена за это - время. Обнулять бины можно только постепенно, тогда артефактов не наблюдается. Физику не обманешь, для хорошей фильтрации нужно четко определенное количество вычислений и не важно, что это будет, БПФ или временная область.
Выкладывать пока смысла не вижу, имхо и так понятно: за качество расплата - время.
|
|
Дата: 15 Дек 2011 00:13:03
#
Programmist я у себя предусмотрел 3 режима качества: low, medium, high. соответственно и скорость обработки будет обратно противоположна этому ряду (((((. здесь действительно - природу не обманешь, нужно искать компромисс ))))))))
|
|
Дата: 15 Дек 2011 00:31:03 · Поправил: Programmist (15 Дек 2011 07:55:49)
#
mikasa76
Да, качество можно задать любое, а на форме уже места не хватает. Если выводить все возможные настройки, потом сам, через некоторое время, не поймешь, что это такое было.
Вижу только один вариант - жать на кнопки и смотреть на спектр, если мало - жать еще несколько раз :)
Для того и усиление с разрешением большое нужно, а не нах неизвестно зачем, как Mesh думает :)
з.ы.
Версию обновил до 11-ой. Фильтры настроил оптимально, режет спектру, как мясорубка, амплитуду держит.
|
Реклама Google |
|