Автор |
Сообщение |
|
Дата: 18 Мар 2013 16:22:36
#
RadioKoteg
YuriVR Что бы получить SSB прежде получаем DSB а потом отрезаем лишнее.. Так что там тоже удвоенная, основная и зеркалка.
Мне кажется, что автору вопроса все же стоит разобраться с основами, и пример с SSB вполне подходит.
Рассуждения в теме про модемы только подтверждают мой тезис.
Деятельность - это осмысленные действия, не стоит об этом забывать, именно это отличает человека от животных.
|
|
Дата: 18 Мар 2013 16:26:29 · Поправил: Programmist (18 Мар 2013 16:31:08)
#
YuriVR
Деятельность - это осмысленные действия, не стоит об этом забывать, именно это отличает человека от животных.
Причем здесь SBB? Написано же русским языком, нет здесь никакого SSB и не будет. |
Реклама Google
|
|
|
Дата: 18 Мар 2013 16:35:06 · Поправил: YuriVR (18 Мар 2013 16:38:46)
#
Programmist
Programmist
Возник интересный вопрос. В умных книжках пишут, что спектр сигнала RF (до демодуляции) всегда в два раза
шире, чем исходный сигнал.
Почитайте себя еще раз внимательно.
А если уж так неймется, то можно почитать и про ЧММС (MSK), такая тоже типа FM.
|
|
Дата: 18 Мар 2013 16:45:37
#
YuriVR
Ну да, конечно, придираться к словам легко, а прочитать дальше две строчки лень, что речь идет про обычную FM-модуляцию.
|
|
Дата: 18 Мар 2013 17:02:45
#
Programmist
YuriVR
Ну да, конечно, придираться к словам легко, а прочитать дальше две строчки лень, что речь идет про обычную FM-модуляцию.
Советую поговорить об «обычной FM» на qrz или сикьюхам, там поймут. Здесь все же лучше постыдиться и уйти читать книжки.
|
|
Дата: 18 Мар 2013 17:17:47 · Поправил: petr0v (18 Мар 2013 17:19:08)
#
Programmist
Годы проходят, а для вас по прежнему проблема элементарный генератор синуса сделать, прибавить к предыдущему значению целочисленной переменной(например беззнаковой 32 бит(автоматом считаем по mod 2^32)) код частоты и вычислить синус от полученного значения(sin(x*2*pi/2^32)), вот вам и ЧМ модулятор, переводите значение амплитуды в частоту.
|
|
Дата: 18 Мар 2013 17:32:11 · Поправил: Programmist (19 Мар 2013 01:24:43)
#
petr0v
Годы проходят, а времени на все не хватает. Если-бы дело было только в генераторе синуса.) Спасибо, попробую обязательно.
Sinus
Совсем забыл, вот это должно обязательно пригодиться. Должно быть по Котельникову, или по Найквисту, понять по кому сложно. На внешний вид график временного домена полностью соответствует Cool2000, но для интерполяции вниз, функцию надо доработать. При отображении на графике, достаточно вычислять максимальную и минимальную амплитуду участка, тогда соответствие получается полное.
Давно я эту функцию мечтал реализовать. Теперь все секреты "Кула" раскрыты.)
YuriVR
Лучше бы Вы не советы мне давали, куда нужно пойти, а взяли и сделали редактор, который здесь требуется.
А то модуляция тут не такая, как на сикьюхам-е, знаем мы все это, проходили.))
з.ы.
petr0v
на нулевой частоте сразу можно делать в IQ, вычисляя не только синус но и косинус от фазового аккумулятора.
В общем, сейчас примерно так и делается, только проблема несколько глубже. IQ можно получить несколькими способами. Тот, который используется в данный момент основан на БПФ, работает быстро и не вносит больших искажений в исходный сигнал, а IQ, полученный стандартным способом, перемножением на синус и косинус, с последующей фильтрацией, обладает несколько иными свойствами и это заметно на реальных демодулированных сигналах, по некоторому изменению в спектре шумов. Создается впечатление, что работает шумоподавление, хотя этого в принципе не должно быть.
Демодулированный сигнал из реального IQ, содержит больше шумов, чем тот же IQ сигнал, прошедший преобразование:
IQ2Real -> Real2IQ(с перемножением и фильтрацией) -> демодуляция той же функцией.
Фильтрация здесь точно, что ни причем, она реализована на БПФ и режет ровно.
Все эти эффекты можно наблюдать в той версии программы, которая сейчас есть. Там временно оставлено два режима демодулятора FM. Модулятор один, без интегрирования, с коррекцией АЧХ.
Фазовую модуляцию добавить не успел, сейчас слишком большие изменения, в связи с введением режима просмотра временного домена, да оно и без надобности, так как с ней все в порядке.
Вполне возможно, что где-то в расчетах есть ошибка. Что-то сдвинулось на один отсчет и получился шумоподавитель, довольно неплохой.)
з.ы.ы.
И наконец, еще один способ FM.
Самый быстрый, без интегралов, IQ и вычисления каких - либо синусов - косинусов. Никаких сложных операций, занимающих время процессора нет.) Конечно, нужно оптимизировать на asm, но тогда будет сложней разобраться.
Результат работы функции, на примере 5 синусоид. Думаю, что на слух отличить от оригинала будет непросто, после нормальной демодуляции, естественно.
Amplitude там значит - амплитуда несущей, несущая всегда будет на половине частоты дискретизации. Амплитуда входного сигнала может быть нормализована до 32767. |
|
Дата: 19 Мар 2013 04:19:05 · Поправил: Sinus (19 Мар 2013 04:23:00)
#
petr0v
DDS уже обсуждали как-то, с интегралами всё гораздо проще - это всего лишь фазовый аккумулятор по модулю 2pi в генераторе частоты
Да, спасибо за напоминание; (это мне склероз изменил...) Оправдываюсь тем, что хотел "из педагогических соображений" показать, как в дискретном времени оценивается мгновенное значение интеграла от S[n], и как оно входит в мгновенную фазу Phase[n] (ведь n нумерует моменты времени :)
Programmist
Интегрирование таким способом в любом случае не годится, не даром везде в формулах нарисована палка интеграла, а как его правильно вычислить не написано
Вот Вы опять смайлик не поставили... (и такими шутками скоро всех петросянов перещеголяете). А если серьёзно: не исключено, что Дельфи не справляется с точным вычислением синуса при больших значениях Phase; (к тому же, я не понял: каков у вас тип данных Integral; это должны были быть не менее чем 32-разрядные числа). Попробуйте улучшенный алгоритм, всего с одним массивом:
Входные данные и константы С1, С2 - те же, что и в предыдущем варианте. Затем:
Phase := -C1
Для n=0 до N-1, с шагом 1, вычисляем: // это начало цикла.
Phase := Phase + C1 + C2 * S[n] //накапливаем аккумулятор фазы.
Если Phase > 2пи, то Phase := Phase - 2пи //берём значения фазы по модулю 2пи
Если Phase < -2пи, то Phase := Phase + 2пи //тем самым исключается неограниченный рост фазы.
S[n] := A * sin(Phase)
Конец цикла. Результат находится в массиве S[n] вместо входного массива данных.
У меня в Маткаде этот ЧМ-модулятор даёт точно такой же (неплохой) результат, как и предыдущая версия. На всякий случай (если кто-нибудь захочет проверить в Маткаде) вот как выглядит этот фрагмент кода в Маткаде у меня:
Увеличить |
|
Дата: 19 Мар 2013 13:01:17 · Поправил: Programmist (19 Мар 2013 17:36:52)
#
Sinus
Второй алгоритм работает. Что было с первым, не знаю, массив Integral 32 бита, в точности такой, как и исходные данные. Надо делать распечатку и проверять, это серьезный баг.
Второй алгоритм:
Функция Delphi здесь. Результат 5 синусоид здесь. При проверке первого алгоритма, забыл про децимацию, в функции помечено звездочками, но это ничего не меняет. Fcar выставил на середину спектра, чтобы было меньше путаницы.
Далее, беру Test_Sin.wav, который лежит на Яндекс-диске, загружаю в программу, проверяю алгоритм , смотрю на амплитуду модулированного сигнала.(
Увеличить
АЧХ после демодуляции кривая, что может быть недостатком, как модулятора, так и демодулятора. Надо выяснять, чей недостаток. Пока сделать это проблематично.
Неравномерность АЧХ:
Увеличить
Ну, это так, для большей наглядности, режим просмотра "Cool+" (Real + Image) сразу показывает несоответствие с оригиналом. Демодулятор второго типа, с фильтрацией, квадратурный из IQ дает несколько иной результат, что и не дает покоя.)
Все к тому, что начинают мучать сомнения, возможно ли вообще простым способом сделать FM модулятор - демодулятор, без потерь в АЧХ, как это происходит в случае с AM и PM. Там, конечно, тоже есть потери, но не такие серьезные. Может быть, 0.5 дБ не так и много, но все равно оно имеет место быть.
Мгновенное значение интеграла в любом случае пригодится. Кто же знал, что оно нужно мгновенное, а не такое, которое добавило некоторое количество головной боли.))
з.ы.
Уменьшил во втором алгоритме девиацию, до исчезновения гармоник.
Увеличить
Первые 50000 отсчетов спектра Test_Sin.wav (FM), девиация 100 Герц.
Если смотреть интерполяцию по Котельникову, то амплитуда везде одинаковая, значит модулятор правильный, скорей всего.
Все это "чудеса" интерполяции (вернее, ее отсутствия, в данном случае), при отображении амплитуды, видимо по другому отобразить нельзя, либо над этим надо поработать. Есть у меня старенький Adobe Audition, там картина такая же, легко может ввести в заблуждение.
Увеличить
Старые грабли.)
Как раз тот случай, когда нельзя равняться на производителей ПО, а надо делать свое. Одна беда - скорость. Считать интерполяцию на больших файлах долго. Какое-то решение должно быть, может что придумаю.
з.ы.ы.
Нормально все с амплитудой после модуляции, с АЧХ не нормально, полного тракта.
А девиацию, наверно, лучше так и оставить в "Герцах", чем в мало понятном слове "Index", для АМ запишу в %, нужно только полностью проверить соответствие.
В первом алгоритме получается переполнение типа данных Phase, поэтому так делать нельзя, в любом случае оно рано или поздно наступит, да и вычисление sin от огромного числа, скорости не добавляет. |
|
Дата: 19 Мар 2013 17:13:26 · Поправил: Sinus (19 Мар 2013 17:15:11)
#
Programmist
Результат 5 синусоид здесь. При проверке первого алгоритма, забыл про децимацию
Во-первых, этот ваш новый Результат 5 синусоид тоже стрёмный - у него к концу слегка падает амплитуда и, кроме того, у него почему-то вдвое выше дискрет (384 кГц), чем был в исходном модулирующем сигнале. Значит, Вы где-то вставили процедуру ресамплинга вверх.
Во-вторых, вижу ещё одну лишнюю процедуру в вашей Функция Delphi здесь., это: NormalizeAmplitude(Smax, False). Поймите: чем больше вводите лишних процедур, тем грязнее становится тест тракта "модулятор - демодулятор". Потому что (не обижайтесь) при том количестве ошибок и разных забыл про..., которые у вас попадают в код, нет никакой уверенности в том, что лишние процедуры у вас работают нормально.
Итак, если вернётесь к тесту с 5 синусоидами, то:
а) возьмите именно исходный модулирующий сигнал (там дискрет 192 кГц, и поэтому такой же дискрет должен быть в итоговом ЧМ-сигнале).
б) не делайте NormalizeAmplitude, а просто задайте значение Smax = 31500 (оно именно такое в том сигнале).
в) на всякий случай не задирайте амплитуду А под завязку, задайте например А = 30000.
Что касается ваших сигналов Test_Sin.wav и Test_Tab.wav, имхо, они не годятся для данного теста т.к. они слишком широкополосные - у них спектр простирается почти вплотную до границы Найквиста Fd/2. (Значит, любое преобразование с ними, которое хоть чуть-чуть расширяет или сдвигает спектр, приведёт к алиазингу и, соответственно, к искажениям. А "в умных книжках" как раз пишут, что спектр ЧМ-сигнала, говоря строго, бесконечен, т.е. его верхняя граница - условное понятие: она лишь приближённо равна граничной частоте модулирующего сигнала) |
|
Дата: 19 Мар 2013 17:39:06 · Поправил: Programmist (19 Мар 2013 19:00:51)
#
Sinus
Все верно, была децимация, без нее нельзя, сейчас поправлю.
Вот он, Smax=31500, A=30000
|
|
Дата: 19 Мар 2013 17:43:21 · Поправил: Sinus (19 Мар 2013 17:51:14)
#
В первом алгоритме получается переполнение типа данных Phase
Если тип данных 32-битный, то этого не могло быть: в данном тесте наибольшее значение Phase не превышает 126000. И значение Integral тоже не могло переполняться, т.к. оно не превышает 250000. Это я проверял заранее, а теперь вот и график показываю - вот так ведут себя эти значения на последней тысяче точек:
Увеличить
Все верно, была децимация, без нее нельзя, сейчас поправлю...
Не понимаю, почему это вдруг нельзя. В описаниях алгоритмов, которые я приводил, указано всё необходимое - в данном ЧМ-модуляторе нет никакой децимации (а если Вы её вставляете, то значит тестируете уже какой-то другой алгоритм: за него я не несу никакой ответственности, и Вы, пожалуйста, тогда не называйте это дело "проверкой функции Синуса" :) |
|
Дата: 19 Мар 2013 17:54:36
#
Не понимаю, почему это вдруг нельзя
Хорошо, называть не буду.) В данном сигнале можно, нельзя потому, что это у меня в голове сложился такой алгоритм, пользователь берет сигнал, жмет кнопку "FM", и получает результат, а не половину его.))
|
|
Дата: 19 Мар 2013 17:59:47 · Поправил: Sinus (19 Мар 2013 18:00:14)
#
Вот он, Smax=31500, A=30000
Ну, вот, совсем другое дело :) Правда, все-таки тут A = 32767, но перебора не возникло, и в итоге всё как и должно быть, нормально.
|
|
Дата: 19 Мар 2013 18:11:46 · Поправил: Programmist (19 Мар 2013 19:32:25)
#
Если тип данных 32-битный, то этого не могло быть
Где-то произошло, сейчас эта функция уже далеко лежит, быстро проверить не смогу, там везде тип данных Single, это 32 бита, а не 64, как в Double. Потом еще раз проверю, но так делать все равно нельзя.
Ну, вот, совсем другое дело :)
Значится, записываю Вашу функцию, как базовую для FM, ну а с АЧХ буду разбираться отдельно. Сейчас всю программу разломал, с этим рисованием временного домена, но он все равно нужен, без него плохо.
Что касается ваших сигналов Test_Sin.wav и Test_Tab.wav, имхо, они не годятся для данного теста т.к. они слишком широкополосные
Годятся! Именно они показывают разницу в FM, PM и AM.
Да и генератор всех этих сигналов уже в программу встроен:
Увеличить
Малая часть из того, что задумано.) |
|
Дата: 19 Мар 2013 18:21:58 · Поправил: Sinus (19 Мар 2013 18:32:14)
#
Ну, вот, совсем другое дело :)
Значится, записываю Вашу функцию, как базовую для FM
Между прочим, при такой неразберихе, не исключено, что ваш результат Вот он, Smax=31500, A=30000 Вы получили своим вторым алгоритмом:)) Я вижу небольшие отличия в спектре от своего результата... но не знаю, возможно, такие отличия связаны и с разницей в точности (у меня 64-битные вычисления).
Именно они показывают разницу в FM, PM и AM
Если вдумаетесь лучше, то поймёте, что с шириной спектра ~100кГц при дискрете ~200 кГц бессмысленно имитировать FM- PM- или AM- реальные радиосигналы (может быть в виде I/Q-сигнала с нулевой несущей ещё и можно, но до этого у вас здесь дело не дошло))
|
|
Дата: 19 Мар 2013 18:32:27 · Поправил: Programmist (19 Мар 2013 18:37:25)
#
Нет, другие алгоритмы в другой (старой) версии, а здесь кнопка еще осталась подписана, под ней Ваш второй алгоритм, убрал только децимацию и нормализацию. Скорее всего, что точность Single будет меньше, там всего семь-восемь знаков после запятой правильно считаются.
может быть в виде I/Q-сигнала с нулевой несущей ещё и можно
Может быть, и до этого дело дойдет. Если не появятся другие задачи, иначе программа снова ляжет на полку, еще на пару лет.
|
|
Дата: 19 Мар 2013 18:37:09
#
А, ну раз кнопка подписана, то да, всё твердяк)
|
|
Дата: 19 Мар 2013 18:40:16 · Поправил: Programmist (19 Мар 2013 20:34:21)
#
Ну и отлично! Одной головной болью меньше. :) Значит, буду "ломать" демодулятор, пока не выйдет АЧХ.
з.ы.
Поправил: Smax=31500, A=30000
Ессно, в спешке значения A и Smax перепутал, а перебора и не должно быть, в 32 бита большая амплитуда помещается.
Эх, жаль вот только мне больших красивых и "говорящих" спектров. Наверно, версия 68 была последней, которая умеет это делать. Никак не сходится масштабирование и увеличение двух доменов одновременно, да и картинки будут несколько другие, с интерполяцией в частотной области, зато будет все точно, до последнего отсчета.
Потом 64 бита… Это много, настолько много, что даже представить себе сложно. В реальной жизни таких сигналов вряд ли найти можно, но при анализе разница видна невооруженным глазом. Есть FFT64, даже использовалось в первых версиях. При необходимости, можно вернуть.
И самая "бредовая" идея: Real Time View :-) |
|
Дата: 19 Мар 2013 20:34:54 · Поправил: RadioKoteg (19 Мар 2013 20:36:26)
#
Эх, жаль вот только мне больших красивых и "говорящих" спектров.
Думаю надо будет утилитку у Вас выпросить сделать, этакую резалку файлов, которая читает большой файл, даже больше 300 МБ, выводит его на экран в виде водопада даже в приближенном спектре и дает возможность визуально найти на спектре нужную активность а потом ничего не делая просто отрезать фрагмент в новый файл. Аудишин не годиться для этого, по простой причине что он не может работать с I/Q . Это в далекую полочку желаний от общественности.
|
|
Дата: 19 Мар 2013 20:44:23 · Поправил: Programmist (19 Мар 2013 20:52:22)
#
RadioKoteg
Можно сделать, но на экран она его весь вывести не сможет. Сможет только записать в виде jpg-ов, метров по 300. Либо в приближенном (не полном) разрешении. Система не позволяет смотреть большие файлы, всякие ошибки появляются непонятные. Буду иметь в виду, в принципе это не сложно, если без возможности редактирования.
Будет читать сразу IQ с диска и одновременно делать из него спектр. Фиксированный размер FFT придется взять, 1024 скорей всего.
|
|
Дата: 19 Мар 2013 20:52:18 · Поправил: RadioKoteg (19 Мар 2013 20:53:50)
#
Programmist Та то потом, не сейчас. Можно и в джепеги, логично, но только сделать шкалы времени и частоты, то есть если сделала программа три джепега за три часа то и время 0...1 1...2 2...3 соотв в каждом отображается. И шкала частоты в каждом. Думаю удобно будет для "необсяжных" просторов гигабайтов записей.. Собственно аналогов то нет и думаю это ускорит рысканье по гектарах после нажатой кнопки рекорд. Все, я не отвлекаю вас от более важных дел.
|
|
Дата: 19 Мар 2013 20:55:56 · Поправил: Programmist (19 Мар 2013 20:58:27)
#
Да, вот только как шкалу сделать непонятно, с боку ее не разглядишь, можно немного "полосатый" спектр рисовать, с линиями округленных частот.
отвлекаю вас от более важных дел
Отвлекаться надо, иначе мозги "клинит" и дело не двигается с мертвой точки.)
|
|
Дата: 19 Мар 2013 21:04:37
#
Да, вот только как шкалу сделать непонятно, с боку ее не разглядишь, можно немного "полосатый" спектр рисовать, с линиями округленных частот. Время снизу вверху, фонтами 12 на контрастном фоне, если смотреть в реальном разрешении то все ок, просто надо привязка к времени иначе в больших файлах ничего не найдешь.. Ну вот частота да, сделать опционально сетку да, но справа слева она должна быть всегда тоже.
|
|
Дата: 19 Мар 2013 21:11:47 · Поправил: Sinus (19 Мар 2013 21:17:09)
#
RadioKoteg, извините, я ещё на секундочку встряну с ЧМ-делами:
Programmist
Значит, буду "ломать" демодулятор, пока не выйдет АЧХ.
Не надо его ломать, он хорош (в пределах своих возможностей), и вполне нормальную даёт АЧХ. Для проверки я сделал в маткаде ЧМ-сигнал с вашей любимой tv-таблицей :)) На нулевой несущей. Притом это I/Q-сигнал, он сделан так, как выше подсказал уважаемый petr0v.
Правда, конвертнул ваш 32-битный исходный Test_Tab.wav в 16-бит, потому что маткад читает только 16-битные вавы (а встраивать ЧМ-модулятор в свою прогу я не буду: на кой он в ней нужен?). Вот как у меня в итоге выглядят спектрограммы:
Исходный модулирующий сигнал (Test_Tab_conv_to_16-bit.wav)
Увеличить
Это IQ-ЧМ-сигнал (FM_IQ_Tab_Fcar=0_Fdev=10kHz.wav)
Увеличить
И вот результат после ЧМ-демода нашим демодулятором
(без всяких фильтраций и децимаций)
Увеличить
Как видите, серьёзных различий между исходной tv-таблицей и после демода - нету!
Так что, АЧХ нашего тракта "ЧМ-мод -- ЧМ-демод" в полном порядке, и не надо больше её бедную ругать :)
На всякий случай, если захотите проверить IQ-ЧМ в своей программе, вот здесь я сложил в zip-папку оба указанных выше wav-файла. Внимание: чтобы ЧМ-демодить IQ-файл с нулевой несущей, не делайте никакого сдвига спектра или преобразования R2IQ, а просто загрузите в свою программу первый канал стерео-файла как массив A[n] и второй канал как массив B[n]. (Вспомните - именно с двумя массивами А и В должен работать наш ЧМ демодулятор; вот как раз эти два массива уже и содержатся в IQ-ЧМ стерео-файле). Успехов! |
|
Дата: 19 Мар 2013 21:12:10 · Поправил: Programmist (19 Мар 2013 21:39:58)
#
RadioKoteg
Так и надо сделать, наверно версию прямо отсюда возьму и туда такую функцию добавлю. Там все для этого есть. Новая когда будет неизвестно, поломал я ее сильно, собирать обратно еще долго придется. Заодно будет перекур, а там, глядишь и все быстрей получится.
Sinus
Вот это номер! Вижу, что все у Вас нормально. Значит у меня ошибка. После демодуляции.
Вот весь код:
j:= 0;
for i:= 0 to wf32DataSize div 2 - 4 do
begin
a:= DATA32[j];
b:= DATA32[j + 1];
aa:= DATA32[j + 2];
bb:= DATA32[j + 3];
c:= (sqr(a) + sqr(b));
if c <> 0 then
DATA32[i]:= ( ( aa * b - bb * a ) * wfSAMPLERATE ) / c
else DATA32[i]:= 0;
Inc(j, 2);
end;
Больше там нет ничего, нормализация амплитуды не в счет. |
|
Дата: 19 Мар 2013 21:40:38
#
Programmist
После демодуляции.
В моей проге спектрограмма вашего файла После демодуляции выглядит абсолютно нормально, как и моя после демода! Похоже, у вас что-то разладилось с построением спектрограмм...
|
|
Дата: 19 Мар 2013 21:46:20 · Поправил: Programmist (19 Мар 2013 22:19:19)
#
Sinus
Так я и предполагал, что у нас разные алгоритмы построения спектрограмм.
Свою сломать не успел, таблица всегда стоит на страже, если что не то, сразу бы заметил.
У меня отличия видны абсолютно четко, чудес-то тут быть не может.
Вот они, оба родимых. До и после процедуры:
Увеличить
Просто тут микс сделал в один файл. Что полярность разная, так на это наплевать, а вот разницу в ЧХ видно. Даже в обычном режиме, если в режиме Cool+ смотреть, так там вообще жуть, режим специально для выявления несоответствий был выдуман. Выше немного есть фото таблицы. С AM и PM такого нет, там порядок, если усиление не выкручивать, то можно сказать, что близнецы - братья.
С модулятором это зря Вы так. Понятно, что сейчас он тут из серии "не пришей кобыле хвост", но потом может пригодится. Мало ли кто захочет посмотреть, как оно в реале происходит. |
|
Дата: 19 Мар 2013 22:15:53 · Поправил: Sinus (19 Мар 2013 22:20:29)
#
Programmist
Посмотрел сейчас ваш файл После демодуляции в версии 40 вашей программы - там тоже так цвет таблицы "гуляет". Но, что больше всего насторожило, раньше я на это не обращал внимания: у вас почему-то сделаны несколько режимов просмотра (Mode) - Standart, Real, Image и Cool+ - и они все показывают разную "гулянку" цвета! Какой моде верить? ))
Ведь на самом-то деле амплитуда каждой спектральной составляющей должна вычисляться строго по одной единственной формуле (и у меня в проге так и сделано, строго по теории): FFT выдаёт Re-часть и Im-часть фурье-амплитуды, и надо возвести в квадрат каждую из них и сложить эти квадраты, а затем извлечь корень:
Амплитуда гармоники = корень квадратный из суммы ((Re^2) + (Im^2)).
Можно не извлекать корень, тогда это будет картина так называемого спектра мощности. Но никакие другие "моды" смысла не имеют, потому что отдельно величины Re и Im могут как угодно "гулять" (отношение Im/Re определяется фазой данной гармоники). Только формула (Re^2) + (Im^2) избавляет от этой гулянки, т.к. она даёт именно желаемую нами амплитуду фурье-гармоники вне зависимости от фазы.
Не знаю, может и у меня есть огрех, но пока я склонен предполагать вот что (будет время, проверю). Наш тракт "ЧМ-мод -- ЧМ-демод" имеет равномерную АЧХ, но неравномерную ФЧХ. Ваш способ построения спектрограммы реагирует на ФЧХ, а Вы думаете, что будто АЧХ неравномерна.
Попробуйте изменить формулу своей спектрограммы на правильную:
Амплитуда гармоники = корень квадратный из суммы ((Re^2) + (Im^2)).
И посмотрим, что получится, а иначе верные выводы сделать не удастся.
|
|
Дата: 19 Мар 2013 22:24:29 · Поправил: Programmist (19 Мар 2013 22:51:09)
#
Sinus
Версия старая, возьмите последнюю.
Режим Standart = ((Re^2) + (Im^2)).
Режимы:
Real = Re^2,
Image = Im^2,
Cool+ = Re^2 и Im^2, через один пиксель, там все огрехи сразу видно.
Еще режим Phaser есть, но он для других специальных целей.
FFT скользящее, в этом, имхо и есть основное отличие.
Все верно, режимы Real и Image смысла большого не имеют, за исключением, когда надо проверить, а есть ли в сигнале Real(Image)-часть, или ее вообще нет. И такое бывает.) Причем Cool+ без напрягов такие сигналы делает из любой картинки, ну а если картинки нет, тогда можно взять карандаш, нарисовать и посмотреть, что будет. А вот режим Re^2 и Im^2, оказался очень полезен.
Наш тракт "ЧМ-мод -- ЧМ-демод" имеет равномерную АЧХ, но неравномерную ФЧХ
Очень даже может быть, спешить не будем, надо все проверять, иначе только народ насмешим.) |
Реклама Google |
|