Автор |
Сообщение |
|
Дата: 06 Дек 2011 23:13:28 · Поправил: Mesh (06 Дек 2011 23:14:22)
#
Programmist Я немного недогнал, А 4-я станция - это какой-то глюк, щас буду разбираться.
Ничего страшного, имхо это уже мелочи. то бишь вы считаете, что это сигналик такой реал с четырьмя станциями? Невзирая на то что в SA их три, а четыре в Куле+? То есть это не косяк Кула+, а косяк SA? Я правильно понимаю идею, чи нет? Оно то может быть, но хотел б какие обоснования услышать, чи увидеть.
|
|
Дата: 06 Дек 2011 23:22:58
#
При переходе к IQ частота 256
извините ,забыл разделить на два. :-)
Про Китай 200,000 кГц
В Петербурге 6 часов на 258,000 кГц
Московское время 10 часов на 500,000 кГц
|
Реклама Google
|
|
|
Дата: 06 Дек 2011 23:37:24 · Поправил: Programmist (06 Дек 2011 23:42:24)
#
Mesh
То есть это не косяк Кула+, а косяк SA?
Скорее всего, это косяк конвертера, я его не проверял, а подключил так, как он был. Откуда у меня обоснования, когда сравнить больше не с чем. Хорошо, что хоть сейчас сигнал и скрин из SA есть.
|
|
Дата: 06 Дек 2011 23:49:09 · Поправил: Mesh (06 Дек 2011 23:55:19)
#
Programmist Дык конвертер то мой. Он реал даёт четыре сигналика, уже прочекил. Но блин, я ж грил, что когда в SA сделали свой, то я был в расстройстве, что-то у меня не совсем гламурно получилось и медленей и с качеством чего-то не то, и я забросил это. Оно то работало, но вот реал на 100 правильно чи нет я добивать не стал, огорчился так сказать, а уж сейчас и подавно ничего не помню. Скоре всего там косяк какой, и так думкаю с фильтрами, бо похоже сильно на то что нет балансу, где-то нарушается. Четвёртый сигналик как-то выглядит недодавленой половиной, но реал я хз, эт думки. Есь конечно вариант, что у меня правильно работает, а в SA неправильно, но я хз, верится с трудом, уж давно б косяки повылазили, не один i/q через SA провёрнут и не тока мной, чёт я не помню что б меня чего смущало сильно, вот ж блин прикольно как.
|
|
Дата: 06 Дек 2011 23:58:10
#
Mesh
Тут без косяков не бывает, тем более, когда проверить нечем. Вот и дошли, наконец, общими усилиями до какой-то цели, если Sinus с формулой не ошибся, все будет просто замечательно. Скорость работы FFT гораздо выше, чем того LPF, ну а о качестве можно не беспокоиться.
|
|
Дата: 07 Дек 2011 00:08:14 · Поправил: Mesh (07 Дек 2011 00:10:23)
#
Programmist Ага вы хотите сказать, что если он ошибся, то так ловко, что в SA типо кажет ошибочный файл неправильно но так как он хотел, а у меня типо, где я точно гарантий дать не могу потому как и не помню вобще чего там и как, типо кажет то что есть? :) Это оченно мифические шансы что у меня правильно, скорее наоборот у меня чёто не так, но будет кино, если всё в обратке будет, но я в это не верю на 100, на 0.001% допускаю, но тогда Sinus просто бог чекитов, сходу такой сигналик сварганить.
|
|
Дата: 07 Дек 2011 00:15:32
#
Mesh
Вот и хз, где правильно, мне так вообще "шестое чуйство" подсказало, что надо на FFT делать, да и в SA, скорей всего на нем сделано, наверно и там люди не за пять минут к верному решению пришли :)
|
|
Дата: 07 Дек 2011 00:21:20 · Поправил: Mesh (07 Дек 2011 00:25:05)
#
Programmist Дык и я щас в думках глыбоких, чё там вобще ЛПФ у меня делает?! Чё я там фильтровал такого? Кино и только.
з.ы. А... вроде припоминаю, лана эт уже офтоп, перемножители, зеркалки и всё такое, да, там наверняк и источник проблем всех этих. Лана, хрен с ним с конвертером.
|
|
Дата: 07 Дек 2011 00:34:39
#
Mesh
Да, ладно, меня тоже фильтр так ушатал, что теперь формулу вписать не могу, хотя и интересно очень, завтра попробую.
|
|
Дата: 07 Дек 2011 02:53:16 · Поправил: Sinus (07 Дек 2011 12:04:36)
#
Mesh, Programmist, всё вы верно выяснили - на частоте 12 кГц появляется "зеркалка" от сигнала 500 кГц после конвертации IQ --> Real-моно упомянутым вами конвертором.
Ф-лы обратного преобразования IQ --> Real-моно (тоже в частотном домене, через голое FFT) я уже вывел и на этом же сигнале с 3-мя станциями проверил: работают как в аптеке, никаких лишних сигналов не образуется! (Извиняйте, щас вынужден спать залечь, завтра вечером напишу ф-лы здесь, и графики представлю, если надо).
Короче, этот метод вроде вполне работоспособен. Да, паразитные "палки" в спектрах появляются, но - величиной примерно 10-4 от полезных амплитуд. Думаю, это из-за 16-битного квантования в процессе формирования вав-файлов; в точных "математических" массивах не вижу лишних палок и шумов заметной величины.
Теперь буду осваивать КИХ-фильтрацию, и тогда посмотрим, насколько она предпочтительнее.
Спасибо ещё раз всем за проверку, обсуждение и советы.
|
|
Дата: 07 Дек 2011 05:23:21 · Поправил: Programmist (07 Дек 2011 06:06:44)
#
Sinus
паразитные "палки" в спектрах появляются, но - величиной примерно 10-4 от полезных амплитуд.
Это могут быть "амплитудные грабли", много раз на них наступал. Диапазон 16-ти бит -32768..32767.
Палки появляются при умножении -32768 на -1. Проблема не решена, поэтому и хочу уйти на внутренний формат с плавающей точкой.
Насчет зеркалки - интересное кино, в конвертере никаких ошибок не видно, LPF тот тысячу раз проверен, если есть ошибка, тогда у меня вообще концы с концами не сходятся. Действительно, проще сделать все заново, чем понять, откуда такой глюк, но как-то странно все это. Буду разбираться, на свежую голову.
ф-лы здесь, и графики представлю, если надо
До сих пор не верится, что так просто все решилось!
Наверно, это от попытки постичь сию науку, в том виде, как она описана в томах с многоэтажными формулами...
Теперь даже страшно брать перо, а вдруг оно и правда заработает :)
|
|
Дата: 07 Дек 2011 12:08:53
#
Sinus Ага, ну и класно, собсно так и думал, что косяк скорее в конвертере моём чем где ещё, так оно на то и выходило ещё много лет назад. :) Programmist Палки появляются да вобще 10-4 эт на уровне -80 дб, какие это нахрен палки?! Эт так мона сказать естественые шумы квантования, так что и морочится особо незачем.
|
|
Дата: 07 Дек 2011 14:07:21 · Поправил: Programmist (07 Дек 2011 21:31:44)
#
Sinus
Что-то я не могу сообразить никак, что куда. Пятый раз пробую, получается все что угодно, кроме того, что надо.
Имею исходную болванку: Для конвертера Real to I/Q
AudioArray16 - Входной массив реальных данных, размером 1024 элемента.
AudioArrayA - ВЫходной массив реальных данных, размером 1024 элемента. Нужно 512 элементов
AudioArrayB - ВЫходной массив реальных данных, размером 1024 элемента. Нужно 512 элементов
ComplexArray1 - массив комплексных чисел, размером 1024*2 элемента.
ComplexArray2 - массив комплексных чисел, размером 1024*2 элемента. Размер?
ComplexArray3 - массив комплексных чисел, размером 1024*2 элемента. Размер?
FFTSize - число = 1024 (размер массивов)
Заполняю комплексный массив реальными данными:
for k:= 0 to FFTSize-1 do
begin
ComplexArray1[k].Re:= AudioArray16[k]; //Data
ComplexArray1[k].Im:= 0; //заполняю нулями
end;
FFT(ComplexArray1, FFTSize); //Прямое преобразование
Переназначение массивов: здесь не смог правильно разложить данные
for k:= 0 to FFTSize-1 do
begin
ComplexArray2[k].Re:= ComplexArray1[k].Re;
ComplexArray2[k].Im:= ComplexArray1[k].Im;
ComplexArray3[k].Re:= ComplexArray1[k].Re;
ComplexArray3[k].Im:= ComplexArray1[k].Im;
end;
IFFT(ComplexArray2, FFTSize); //Обратное преобразование с размером FFTSize?
IFFT(ComplexArray3, FFTSize); //Обратное преобразование с размером FFTSize?
Теперь получаю 2 ВЫходных массива, абсолютно одинаковых и идентичных входному.
здесь, по всем правилам, их размер должен быть в 2 раза меньше т.е. 512
for k:= 0 to FFTSize-1 do
begin
AudioArrayA[k]:= Round(ComplexArray2[k].Re); //с округлением до целого
AudioArrayB[k]:= Round(ComplexArray3[k].Re); //с округлением до целого
end;
Если не сложно, можно дописать в переназначение массивов то, что не хватает. С моно-стерео на выходе, я уж сам как-нибудь :)
Теперь то, что пока к делу отношения не имеет. (убрал в текстовый файл)
http://www.radioscanner.ru/uploader/2011/fft174859.txt
Вообще, сейчас в программе используется два модуля FFT. Один "быстрый" 32-x битный, на asm-e, второй 64-х битный и более медленный, но позволяющий задать блок большого размера. Оба модуля комплексные и идентичны по входным - выходным параметрам, только в одном из них, вторая половинка Imag-a идет с обратным знаком. Исправлять не стал, потому, что не знаю, как правильно.
Mesh
естественые шумы квантования
Да тут не всегда все понятно, часто эти "палки" вводят в заблуждение, начинаешь искать ошибку не там, где надо, а дело оказывается в амплитуде. Потом этот глюк имеет свойство появляться через N-ное количество раз, а на спектре с большим усилением все видно очень хорошо.
з.ы.
Sinus
В формуле: A(k) = Re(Z(k+c) + Z(c-k)) + i*Im(Z(k+c) - Z(c-k)) не могу понять, что такое i.
После очередной неудачной попытки вставить формулу, решил, что на словах все объяснить и понять, что куда попадает, будет сложно, поэтому собрал простейшую демо - программу, с живым модулем FFT из основной программы, который и является основой всего:
http://www.radioscanner.ru/uploader/2011/ffttable01.rar
Там в текстовом виде, можно залить входные массивы нулями или случайным числом 0-255 (имитация 8 бит wav). Есть опция Reorder, как у прямого, так и у обратного преобразования, но я ее никогда не использую (всегда включена). Сама формула должна быть в модуле MainUnit.pas. Блок выбран небольшой, 32 значения, имхо этого вполне достаточно.
Вот, где-то так оно и есть, одно прямое и два обратных преобразования.
А главное, что не покидает мысль о том, что этот модуль и "заточен" для работы с комплексным сигналом, где можно сразу залить один канал в Real, другой в Image и получить каким-то хитрым способом сразу реальный сигнал, одним преобразованием.
Все это совсем не к спеху, потому, как только начинает укладываться в голове, какие возможности открываются, при обработке сигнала, разложенного в I/Q и на это нужно время. Что касаемо звука, так это просто фантастика, за одно и офтоп :) |
|
Дата: 07 Дек 2011 22:39:30 · Поправил: Sinus (07 Дек 2011 22:41:43)
#
Конверсия IQ-->Real в частотной области (обозначения те же, что были выше для конверсии Real-->IQ):
Считываем из двух каналов вав-файла вещественные массивы A(t) и B(t). Их длина есть N(ВЧ)/2.
Прямое FFT(A) и FFT(B) даёт два комплексных массива A(k) и B(k).
Здесь k = 0,1, ... c, где c = N(ВЧ)/4.
Вычисляем вдвое более длинный комплексный массив Z(k) по формулам:
для k = 0,1, ... , c-1:
Z(k) = (1/2)*[ Re(A(c-k)) - i*Im(A(c-k)) + i*Re(B(c-k)) + Im(B(c-k)) ].
для k = c, c+1, ... , N(ВЧ)/2:
Z(k) = (1/2)*[ A(k-c) + i*B(k-c) ].
Тогда обратное Фурье-пр-е, IFFT(Z), даёт вещественный массив S(t). Он ещё вдвое более длинный, т.е. число элементов в нём равно N(ВЧ). Записываем его в 1-канальный вав-файл с частотой дискретизации Fdiscr(ВЧ), вдвое большей, чем была в IQ-файле. Вот и всё.
|
|
Дата: 07 Дек 2011 22:45:48 · Поправил: Programmist (07 Дек 2011 22:49:38)
#
Sinus
Буковкой "i", то что за значение обозначено?
А то я тут уже пошел на метод "тыка", вырезал из сигнала бегемота в кресле, сделал из него стерео и разворачиваю, который час, пока в нужную сторону не попадет :)
|
|
Дата: 07 Дек 2011 22:57:11 · Поправил: Sinus (07 Дек 2011 23:02:21)
#
Programmist, думаю, не надо рассматривать конверсию в частотной области как окончательный рецепт. Давайте прислушаемся к опыту petr0vа и mikasa76, одумаемся, пока не поздно - они дело говорят. ))
Ведь эти игры - только для проверки понимания спектральной картины, ну, и как способ на первых порах уклониться от разбирательств с фильтрами. Это работает на специально подогнанных под данную методу файлах. Не смогу спать спокойно, если окажется, что я подначил Вас зайти в тупик. ))
А тупик тут виден. Ведь FFT целиком над всем сигналом S(t), да ещё чтобы число отсчётов было 2 в целой степени - это очень связывающие условия; тем более жёсткие, чем длиннее сигнал. Хорошая прога должна быть от них свободна. Вот именно обработка во временной области, отсчёт за отсчётом, как нам уже советовали, снимет эти искусственные ограничения.
О Ваших модулях FFT, IFFT - надо сначала разобраться, что они выдают, а иначе я не знаю, как ими распорядиться в формулах.
В маткаде всё проще: команда Z:=FFT(S) автоматически создаёт массив комплексных чиcел Z(k), вдвое более короткий, чем входной вещественный массив S(t). А у Вас, если я верно понял, функция FFT(ComplexArray1, FFTSize) возвращает результат в ту же матрицу ComplexArray1, в одном из двух столбцов которой был входной вещественный массив, причём длина массивов задаётся независимо числом FFTSize.
Тогда надо выяснить, что она возвращает. Хорошо, если пол-массива будут амплитуды Z(k), а остальная половина - комплексно-сопряжённые амплитуды. Сделайте, плз, такой тест: в качестве исходного реального массива возьмите простую последовательность чисел 0, 1, 2, ..., 1023.
AudioArray16[k] := k
И после вызова FFT(ComplexArray1, FFTSize) распечатайте в два txt-файла получившиеся два массива, т.е. поотдельности ComplexArray1[k].Re и ComplexArray1[k].Im. И пришлите их сюда посмотреть. Сравним с тем, что получается у меня, и узнаем, что ваш модуль выдаёт после номера 513.
зы. буква i в формулах комплексной алгебры всегда означает мнимую единицу, так же как и в формуле Эйлера. Знать правила комплексной алгебры в нашем деле необходимо. Формулы, которые я приводил, это - просто-напросто процедуры комплексного сопряжения, и изменения номеров у фурье-амплитуд.
зы.зы. Никогда не используйте для тестов массивы случайных чисел. Например, я не могу проверить вашу демо-FFT, потому что надо точно сравнить её результаты с работой моего FFT. Но мой маткад сгенерит наверняка другие rnd-значения, и ничего не удастся сравнить. Надо сначала научиться понимать, что модуль выдаёт в легко анализируемых вручную ситуациях - например, на суммах нескольких синусоид или косинусоид с заданным фазовым сдвигом.
|
|
Дата: 07 Дек 2011 23:04:48
#
Sinus Ни как не подначить, истины ради токмо. :-) Давайте прислушаемся к опыту petr0vа и mikasa76, одумаемся, пока не поздно - они дело говорят. )) Это опыт не одного поколению ЦОШников, просто сказано это прямее уж некуда. До этого мягко уговаривали тов Programmist ознакомится так сказать с наследием. :-) Так ж мягко уговаривают таки осилить какие ни какие основы матапарата, иначе блукать веками в трёх соснах. :-)
|
|
Дата: 07 Дек 2011 23:07:37 · Поправил: Programmist (08 Дек 2011 00:11:42)
#
Sinus
возьмите простую последовательность чисел 0, 1, 2, ..., 1023.
В исходный Image залил нули, в Real 0..1023 результат FFT: см. ниже
|
|
Дата: 07 Дек 2011 23:16:28 · Поправил: Sinus (07 Дек 2011 23:19:16)
#
Programmist, чё-то результат мне абсолютно не понятен. Сделайте, плз, ещё наоборот - нули в Re, подряд числа в Im. И я должен какое-то время подумать, и м.б. пришлю вам тхт-файл с отсчётами чистого синуса - надо посмотреть, что выйдет на чистой синусоиде.
Mesh, дык вот, будем коллективно подначивать Programmista к учёбе. Чё-то я уже не понимаю, как с таким FFT вообще картинки-то получались....
|
|
Дата: 07 Дек 2011 23:21:25 · Поправил: Programmist (08 Дек 2011 00:12:11)
#
Sinus
Чё-то я уже не понимаю, как с таким FFT вообще картинки-то получались....
Это FFT - то FFT, что доктор прописал :) и картинки с ним качества отменного, просто есть некоторые отличия от модуля в Матлабе.
А насчет спать спокойно, так это чисто моя затея и просто так не сдамся :)
Mesh
ознакомится так сказать с наследием
Так я бы ознакомился, да где оно, наследие-то, в рабочем варианте? Пока кроме SA ничего нет, но у меня его нет, да если и был, то поможет это мало.
|
|
Дата: 07 Дек 2011 23:29:09
#
Programmist, вроде начинает до меня доходить, м.б. и нормально работает у вас, только не пойму, почему все числа целые. Пошёл подумать и поразглядывать...
|
|
Дата: 07 Дек 2011 23:31:09 · Поправил: Mesh (07 Дек 2011 23:31:34)
#
Sinus К стати, к стати опять ж истины ради токмо. :) МетОда sample by sample так ж как и метода all samples one moment это две крайности так сказать, два слона на коих держится ЦОС, практикал истина где-то посерёдке. :-) В разных задачах эта истина смещается туды или сюды, ну эт тож в книжках не скрывают, но так как бы уточнить. :)
Да не ФФТ то у него наверно пральное, не сам ж он их писал :-) А вот как ими там рулят, эт да, эт на его совести, и знает только он как имено.
|
|
Дата: 07 Дек 2011 23:32:16 · Поправил: Programmist (07 Дек 2011 23:39:59)
#
Sinus
почему все числа целые
Лоханулся я, там везде Round стоит.
Значит буду дальше "крутить бегемота", пока не сложится в нужном направлении :)
У FFT есть недостаток, при числах на входе, размером более 24-х бит, результаты получаются не совсем точными.
|
|
Дата: 07 Дек 2011 23:40:07 · Поправил: Sinus (07 Дек 2011 23:57:24)
#
Programmist, плз, повторите без Round первый вариант (да, с нумерацией строк - хорошо), и я отойду думать, чё с ними делать. Вся игра-то у меня была на разной длине массивов, а тут надо неспеша подумать...
зы. Кстати, чтобы этот этап достойно завершить, надо мне ещё нарезку на части того знаменитого файла с тётями опробовать...
зы. зы. Да, а вот ещё нюансик - в моём сигнале с 3-мя якобы АМ-станциями несущая бралась как косинус со сдвигом фазы. На частоте F1 сдвиг = 0, на частоте F2 сдвиг = пи/2, на частоте F3 сдвиг = пи/3, если правильно запомнил. Чё-то никто этого сугубо "квадратурного" факта не упомянул.... :)
А хотя... наверное только относительные изменения фазы одной несущей можно заметить, а фазовые сдвиги разных несушек друг относительно друга, наверное, не улавливаются... Абсолютная фаза не наблюдаема, да...
|
|
Дата: 07 Дек 2011 23:40:58
#
Programmist Да причём тут SA? Книг наваяно авторами ну уж просто море разливаное, даж искать не надо, тут на ресурсе собрано колекция целая. Да лана, всему своё время имхо. :)
|
|
Дата: 07 Дек 2011 23:57:06
#
Sinus Чё-то никто этого сугубо "квадратурного" факта не упомянул.... :) Ого! А надо было упомянуть? :-) Ну може Programmist напишет софтину где это будет упоминатся, и покажет практикал ценность этого на реал сигналиках. Тут как бы эта, синтез синтезом, реал задачи реал задачами. Все эти пи/n рулят в ОФДМ ну дык там оно сам бог велел, а тут, АМ и АМ чего с неё взять то больше, и зачем?
|
|
Дата: 07 Дек 2011 23:58:48
#
Mesh, да, я уже, осознал. Прошу пардону. ))
|
|
Дата: 07 Дек 2011 23:59:46 · Поправил: Programmist (08 Дек 2011 00:07:07)
#
Sinus
Вот так вернее будет: http://www.radioscanner.ru/uploader/2011/fftreim.txt
Там 3 варианта, разделитель - табуляторы. Старые файлы удалю.
Все надо проверять, абсолютно согласен. И именно в текстовом виде, когда это возможно, иначе не спасут ни книги, ни опыт предыдущих поколений :) |
|
Дата: 08 Дек 2011 00:03:20
#
Programmist, спасибо. Ну, пойду кумекать, а то в режиме он-лайн не сосредоточиться....
|
|
Дата: 08 Дек 2011 00:08:36 · Поправил: Programmist (08 Дек 2011 18:15:13)
#
Sinus
Точно, а я пойду спать, на сегодня уже накрутился :) Доброй Всем ночи!
з.ы.
В конце концов, у меня есть еще один путь, это заменить в конвертере LPF на свой новоиспеченный фильтр, а в процессе замены сделать и обратную операцию R2I/Q. Делать двухсторонний конвертер все равно придется, любым способом и в реальном времени. Уж очень заманчива перспектива работы со звуком, имхо тут есть ответ на некоторые нерешенные вопросы.
з.ы.
А у Вас, если я верно понял, функция FFT(ComplexArray1, FFTSize) возвращает результат в ту же матрицу
Это в целях повышения скорости работы, можно их разделить, но не желательно, реально это даже не матрица, а указатель на область памяти. Модуль еще требует доработки, и эта матрица будет динамической, сейчас ее размер взят с запасом. FFTSize это некая точка остановки обработки и возврат к началу, да это особого значения не имеет. Массивы (матрицы) маленькие и для памяти современных машин ничего не значат, а вот разделение (удвоение) ее на входную и выходную может заметно снизить скорость.
Вот с буквой "i" пока не понял, у меня таких переменных быть не может, это обязательно должно быть каким-то реальным числом. В Паскале вся математика предельно проста.
FFT целиком над всем сигналом S(t), да ещё чтобы число отсчётов было 2 в целой степени - это очень связывающие условия
Проблема актуальна для фильтров и решается окнами с перекрытием. Склеить куски не всегда легко, но это работает, недостающие части дополняются нулями, можно взять FFT 65536 с сигнала в три отсчета и результат будет верный. Там, где окна не нужны, вообще не вижу никаких проблем.
Падение точности расчетов, при работе с огромными числами - неприятный момент, но на практике такое встретить не реально. Все форматы - максимум 24 бита целое число. 32 бита - число до единицы (включительно).
з.ы...
И опять к комплексному модулю. Там получается реально 2 рабочих канала за один цикл, только надо понять, что в каком порядке попадает в частотную область в таком режиме. Удвоение скорости, имхо это очень важно.
з.ы.^N
А пока прога не идет, собрал калькулятор, зачем - не знаю, но пусть будет, может быть, когда на что сгодится :)
В нем использовано оба модуля (опция FFT64), один из модулей страдает "зеркальной болезнью", какой не понятно. Данные можно загрузить из текстового файла и править руками в левом окне.
Увеличить
Сама программа и исходники здесь: http://www.radioscanner.ru/uploader/2011/fftcalc.rar
Сразу видны все неточности в операциях с плавающей точкой :( |
Реклама Google |
|