Некоторое время назад я пробовал разные способы рисования цифровых сигналов , и одна из вещей, которые я пробовал, вместо стандартного силуэта огибающей амплитуды отображать его больше как осциллограф. Вот так выглядит синусоидальная волна в области видимости:
Наивный способ сделать это:
- Разделите аудиофайл на один фрагмент на горизонтальный пиксель в выходном изображении
- Рассчитайте гистограмму амплитуд выборки для каждого куска
- Постройте гистограмму по яркости в виде столбца пикселей
Это производит что-то вроде этого:
Это прекрасно работает, если на блоке много выборок, а частота сигнала не связана с частотой дискретизации, но не иначе. Например, если частота сигнала является точной кратной частоте дискретизации, выборки всегда будут происходить с одинаковыми амплитудами в каждом цикле, а гистограмма будет состоять только из нескольких точек, даже если между этими точками существует реальный восстановленный сигнал. Этот синусоидальный импульс должен быть таким же плавным, как левый выше, но это не так, потому что он ровно 1 кГц, и отсчеты всегда происходят вокруг одних и тех же точек:
Я попытался увеличить частоту дискретизации, чтобы увеличить количество точек, но это не решает проблему, а только помогает сгладить ситуацию в некоторых случаях.
Так что мне бы очень хотелось, чтобы был способ рассчитать истинный PDF (вероятность и амплитуда) непрерывного восстановленного сигнала из его цифровых выборок (амплитуда в зависимости от времени). Я не знаю, какой алгоритм использовать для этого. В общем случае PDF функции является производной ее обратной функции .
PDF греха (х):
Но я не знаю, как рассчитать это для волн, где обратная функция является многозначной , или как сделать это быстро. Разбейте его на ветви и вычислите обратное для каждого, возьмите производные и сложите их все вместе? Но это довольно сложно, и, вероятно, есть более простой способ.
Этот «PDF интерполированных данных» также применим к попытке, которую я сделал для оценки плотности ядра трека GPS. Он должен был иметь форму кольца, но поскольку он смотрел только на образцы и не учитывал интерполированные точки между образцами, KDE больше походил на горб, чем на кольцо. Если образцы все, что мы знаем, то это лучшее, что мы можем сделать. Но образцы не все, что мы знаем. Мы также знаем, что между образцами есть путь. Для GPS не существует идеальной реконструкции Найквиста, как для аудио с ограниченной полосой пропускания, но основная идея все еще применима, с некоторыми догадками в функции интерполяции.
источник
Ответы:
Интерполируйте в несколько раз исходную скорость (например, 8-кратную передискретизацию). Это позволяет принять кусочно-линейный сигнал. Этот сигнал будет иметь очень небольшую погрешность по сравнению с бесконечным разрешением, непрерывной синусоидальной (x) / x-интерполяцией формы сигнала.
Предположим, что каждая пара значений передискретизации имеет непрерывную линию от одного значения к другому. Используйте все значения между. Это дает вам один тонкий горизонтальный срез от y1 до y2 для накопления в PDF произвольного разрешения. Каждый прямоугольный срез вероятности должен быть масштабирован до области 1 / nsamples.
Использование линии между сэмплами, а не самих сэмплов, предотвращает «скачкообразный» PDF, даже в том случае, когда существует фундаментальная связь между периодом выборки и осциллограммой.
источник
По сути, я бы использовал «случайный пересэмплер» Джейсона Р., который, в свою очередь, является реализацией стохастической выборки yoda на основе предварительно отобранных сигналов.
Я использовал простую кубическую интерполяцию для одной случайной точки между каждыми двумя выборками. Для примитивного звучания синтезатора (затухание от насыщенного, не ограниченного по площади прямоугольного сигнала + даже гармоник до синуса) это выглядит так:
Давайте сравним это с версией с более высокой выборкой,
и странный с той же частотой дискретизации, но без интерполяции.
Примечательным артефактом этого метода является превышение в квадратичной области, но на самом деле это то, как PDF-сигнал от sinc-фильтра (как я уже говорил, мой сигнал не имеет полосы пропускания) также выглядел бы и представлял воспринимаемую громкость намного лучше чем пики, если бы это был аудиосигнал.
Код (Haskell):
rand list
список случайных величин в диапазоне [0,1].источник
stochasticAntiAlias
этого. Но версия с более высокой частотой действительно одинакова в обоих случаях.Хотя ваш подход является теоретически правильным (и его необходимо слегка изменить для немонотонных функций), чрезвычайно трудно вычислить обратное значение обобщенной функции. Как вы говорите, вам придется иметь дело с точками ветвления и срезами ветвей, что выполнимо, но серьезно вы бы этого не хотели.
Как вы уже упоминали, регулярные выборки выбирают один и тот же набор точек и, как таковые, очень восприимчивы к плохим оценкам в регионах, где выборка не производится (даже если критерий Найквиста удовлетворен). В этом случае выборка на более длительный период также не помогает.
В целом, когда речь идет о функциях плотности вероятности и гистограммах, гораздо лучше думать о стохастической выборке, чем о регулярной (см. Введение в связанном ответе). Выбрав стохастически, вы можете гарантировать, что каждая точка имеет равную вероятность попадания и является намного лучшим способом оценки pdf.
Вы можете легко увидеть, что, хотя он шумный, он намного лучше приближает к фактическому PDF, чем тот, который справа показывает нули в нескольких интервалах и большие ошибки в нескольких других. Имея более длительное время наблюдения, вы можете уменьшить дисперсию справа, в конечном итоге сходясь к точному PDF (пунктирная черная линия) в пределе больших наблюдений.
источник
Оценка плотности ядра
Одним из способов оценки PDF формы волны является использование оценки плотности ядра .
Обновление: интересная дополнительная информация.
Итак, угадайте, что вы можете сделать после того, как объедините все PDF-файлы каждого компонента Фурье вместе:
Однако требуется больше мыслей!
источник
Как вы указали в одном из ваших комментариев, было бы привлекательным иметь возможность вычислять гистограмму восстановленного сигнала, используя только выборки и PDF-функцию sinc, которая интерполирует сигналы с ограниченной полосой частот. К сожалению, я не думаю, что это возможно, потому что гистограмма sinc не имеет всей информации, которую имеет сам сигнал; вся информация о позициях во временной области, где встречается каждое значение, теряется. Это делает невозможным моделирование того, как масштабированные и задержанные по времени версии sinc будут суммироваться вместе, что и нужно для расчета гистограммы «непрерывной» или дискретизированной версии сигнала без фактического выполнения повышающая дискретизация.
Я думаю, что вы оставили интерполяцию как лучший вариант. Вы указали пару проблем, которые помешали вам сделать это, и я думаю, что они могут быть решены:
Затраты на вычисления: это, конечно, всегда относительная проблема, в зависимости от конкретного приложения, для которого вы хотите его использовать. На основании ссылки, которую вы разместили в галерее визуализаций, которые вы собрали, я предполагаю, что вы хотите сделать это для визуализации аудиосигналов. Если вы заинтересованы в этом для приложений в режиме реального времени или в автономном режиме, я бы посоветовал вам создать прототип эффективного интерполятора и посмотреть, действительно ли он слишком дорог. Многофазная повторная выборка - хороший способ сделать это гибким (вы можете использовать любой рациональный фактор).
источник
Вам необходимо сгладить гистограмму (это даст результаты, аналогичные использованию метода ядра). Как именно должно выполняться сглаживание, требует экспериментов. Может быть, это также можно сделать путем интерполяции. В дополнение к сглаживанию, я полагаю, вы также получите улучшенные результаты, если увеличите частоту дискретизации таким образом, чтобы частота дискретизации была «значительно выше», чем самая высокая частота на входе. Это должно помочь в «сложном» случае, когда синусоида связана с частотой дискретизации таким образом, что в гистограмме заполняются всего несколько элементов. Если довести до крайности, достаточно высокая частота дискретизации должна давать хорошие графики без сглаживания. Таким образом, повышение частоты дискретизации в сочетании с некоторым типом сглаживания должно дать лучшие графики.
Вы приводите пример тона 1 кГц, где график не такой, как вы ожидаете. Вот мое предложение (код Matlab / Octave)
Для вашего тона 1000 Гц вы получаете это
Что вам нужно сделать, это настроить выражение upsampling_factor в соответствии с вашими предпочтениями.
Все еще не уверен на 100%, каковы ваши требования. Но используя вышеупомянутый принцип повышения частоты дискретизации и сглаживания, вы получите это для тона 1 кГц (сделанный с Matlab). Обратите внимание, что в исходной гистограмме есть много бинов с нулевыми попаданиями.
источник