Взял вот этот звук:
и попытался раскодировать самописной программкой, которая фильтрует частоты - вроде ничего получилось
Code: Select all
000000109| |
000000219| |
000000329| |
000000439| |
000000549| |
000000659| ....----... . . .|
000000769|.-+**+*#-++-------+-|
000000879|+*###**#+**+**+++***|
000000989|+###**#++**+**++**+*|
000001099|-*#####+**+++*+++++*|
000001209|+####-+**+.---.---.-|
000001319|**+--..--. |
000001429|++--. |
000001539|--*+-. |
000001649|+++-.. |
000001759|++--.- . |
000001869|--. .-. . |
000001979|..-. --. . |
000002089|...---.. |
000002199|.. -+.. |
000002309|.. ..--.. |
000002419| .-- |
000002529| .-. |
000002639| .+ |
000002749| -- |
000002859| -. |
000002969| .-. |
000003079| .- |
000003189| .- |
000003299| -. |
000003409| - |
000003519| .- |
000003629| -. |
000003739| -. |
000003849| .- |
000003959| .- |
000004069| -.|
000004179| -|
000004289| .|
000004399| |
000004509| |
000004619| ... |
000004729|..--**+.+...--.-.---|
000004839|--+###+-*++++++++++*|
000004949|--*###*#*#*******+**|
000005059|..+*+**####*++*+++**|
000005169|++*++++**-*------+-+|
000005279|---.----. .. .. ...+|
000005389| ..|
000005499| .- |
000005609| -. |
000005719| -. |
000005829| -. |
000005939| .- |
000006049| -. |
000006159| -. |
000006269| .- |
000006379| .- |
000006489| -. |
000006599| -. |
000006709| .- |
000006819| - |
000006929| -. |
000007039| ..+ |
000007149| .--. |
000007259|.. ...+. |
000007369|...--.-. |
000007479| -++. |
000007589|..-++- |
000007699|..+*+.. |
000007809|.-+++ . |
000007919|+++-. . |
000008029|.----... |
000008139|----... |
000008249|--.. |
000008359| |
000008469| |
000008579| |
000008689| |
000008799| |
000008909| |
Выглядит даже лучше, чем спектрограмма в Audacity ( тут кадр положен на бок, если кто не понял ; )
Есть небольшая задержка на декодировании - порядка 7мс, что вполне терпимо (и она одинаковая для всех частот)
Алгоритм такой - имея таблицы синусов и косинусов для всех 20 частот с дискретизацией 44100 Гц я умножаю входной 16-битный сигнал со знаком (точнее каждый отсчёт этого сигнала, приходящий с частотой дискретизации 44100 Гц) на каждый синус и каждый косинус, получая 40 сигналов, которые идут на IIR фильтры низких частот с порогом срезания 88 Гц, что помогает выделить постоянную составляющую для каждого канала (умножая частоты получается смесь сигналов с суммой частот и разницей частот - нам нужна только разница, которая равна нулю, если частоты совпадают), далее берём пару отфильтрованный синус S и отфильтрованный косинус C для каждой из 20 частот и считаем амплитуду выделенного сигнала соответствующей частоты как sqrt(S*S+C*C), правда для ускорения вычислений я не вычисляю корень, а прямо так и использую квадрат амплитуды, усредняя его за 110 отсчётов (получая 400 замеров всех 20 частот за секунду), чтобы далее отобразить в виде символа, соответствующего яркости "пиксела" (каждого из 20), принимая во внимание, что амплитуда входного сигнала у каждой частоты не должна превышать 1638 (т.к. именно так они изначально "смешивались")...
P.S. До этого я пробовал нагенерить 20 фильтров с соответствующей полосой пропускания, чтобы покрыть каждую частоту, но с ними ничего путнего не получилось - задержка разная, усиление разное, некоторые фильтры разбегаются и т.д. (покопавшись в архивах увидел, что я это же пытался сделать в ноябре 2010 года и тоже ничего не вышло). А вот вариант описанный выше - самый жизнеспособный. Фильтры для обоих вариантов генерил с помощью вот этого сайта
https://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html (но сама программка mkfilter с исходниками у меня тоже есть - пользовался ей в 1998 году по работе).
P.P.S. Вот для наглядности картинки с вышеупомянутого онлайн-генератора для использованного IIR фильтра низкой частоты с частотой среза 88 Гц - по горизонтали доля от частоты синхронизации, красная линия - амплитуда, синяя линия - фаза (нам она ненужна):
6704782F.gif.png
Получается ослабление в половину (0.5) происходит где-то в районе 105 Гц (0.0024 от частоты дискретизации), на четверть (1/4) в районе 136 Гц и на 1/8 в районе 176 Гц
Задержку в работе фильтра можно оценить по импульсному ответу (в единицах частоты дискретизации, которая 44100 Гц):
6704721T.gif.png
Как видно пик приходится примерно на 4 мс
You do not have the required permissions to view the files attached to this post.