2009-12-12 2 views
0

Я реализовал базовый алгоритм Karplus-Strong.
Ringbuffer, заполняя белым шумом, выводит образец спереди и добавляет среднее значение первых двух элементов в конец и удаляет первый элемент. Повторите последнее действие.Расширение Karplus-Strong с фильтром нижних частот

Для улучшения результатов и контроля над ними я попытался реализовать расширенную версию алгоритма.
Поэтому вместо фильтра усреднения мне нужен фильтр частоты, например фильтр нижних частот.
Мой фильтр усреднения имеет два входа и один выход: avg (a, b) = (a + b)/2

Пример кода на странице wikipedia дает столько выходов, сколько входов.
http://en.wikipedia.org/wiki/Low-pass_filter

я нашел другую (математическую) версию, как:
http://cnx.org/content/m15490/latest/
Н (г) = (1+ (1/г))/2
Я предполагаю г является комплексным числом.

Обе версии имеют два входа, но также два выхода.
Как я получу одно значащее значение из этого?
Или мне нужно переписать большую часть алгоритма?
Если это так, то где я могу найти хорошее объяснение?

ответ

2

Ваш фильтр является специализацией фильтра конечных импульсных откликов. Вы используете moving average method для выбора коэффициентов, используя N = 1. Он уже является фильтром нижних частот.

Расчет коэффициента и порядка фильтрации фильтра для конкретной частотной характеристики включает сложную математику. Лучше всего использовать программный пакет для вычисления коэффициентов, если скользящая средняя не соответствует вашему счету. Matlab - обычный выбор, GNU Octave - вариант с открытым исходным кодом.

+0

Спасибо за ответ. Я не знал, что я уже использую фильтр нижних частот. Тогда мне нужен более продвинутый с параметрами. Спасибо за подсказки для расчета коэффициента и порядка. Я буду использовать это в будущем. Но актуальной проблемой является реализация такого фильтра. –

+0

Реализация очень проста: y = c0 * x [0] + c1 * x [1] ... Установка хороших значений для c является трудной частью. –

+0

Да, это просто. Также объясняется, почему среднее значение является фильтром нижних частот. (a + b)/2 => 0,5 * a + 0,5 * b. Вопрос ответил и принят. Я думаю, что высокий и басовый бас одинаково простой? Если бы вы могли бы также написать эти алгоритмы? –

0

Фильтры могут выражаться в ряде способов:

  1. На комплексной плоскости, ваш пример Н (г) = (1+ (1/г))/2
  2. В качестве фильтра, y[i] = h[0]*x[i] + h[1]*x[i-1] + h[2]*x[i-2] + ...
  3. В частотной области, Y [F] = Н [е] * Х [е]

Второй из них на самом деле является сверткой Н и Х массивов. Это также легче всего понять.

В предыдущем ответе объяснили, с чего начать строительство фильтра. Предполагая, что у вас есть коэффициенты фильтра, h, то это просто суммирование по неотрицательным.

Я считаю, что вижу то, о чем вы просите. Хотя вам не нужно больше одного выхода. На странице Википедии алгоритма синтеза строки Карплус-сильный необходим буфер длиной L. Если мы имеем коэффициенты фильтра M (h), что дает выход формы,

y[i] = x[i] + h[0]*y[i-L] + h[1]*y[i-(L+1)] + h[2]*y[i-(L+2)] + ...

Карплус-Сильный синтез из here использует кольцевой буфер для хранения последних L выходов, y[i-1],...,y[i-L].Это инициализируется как значения шума x[i] для i<=L; однако, для i>Lx[i]=0. Алгоритм будет экономить пространство, поскольку вы сохраняете только значения L. Сигнал x[i] для i>L просто добавлен в кольцевой буфер.

И, наконец, в качестве предупреждающего сообщения, если вы не будете осторожны с количеством коэффициентов h, а значения выходов y могут не иметь желаемого поведения.

+0

Я знаю почти ничего об этом, поэтому, возможно, я внедрил это неправильно. Я использовал объяснение из: http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html (а не моей домашней работы), и в соответствии с этим ringbuffer используется как задержка и обратная связь. Также шаг обновления занимает всего два входа. И генерируемые звуковые звуки, как гитара. Если вы все еще думаете, что все значения в буфере должны использоваться, вы могли бы объяснить далее? –

+0

Я смотрел на бумагу со страницы [Wikipedia] [1]. Он имеет 'y [n] = x [n] + 0,5 * (y [nN] + y [n- (N + 1)])', а не 'y [n] = x [n] + 0.5 * (y [n-1] + y [n-2]), что я и предполагал. Таким образом, вы, похоже, правильно знаете, как создается буфер. Страница Princeton также добавляет распад 0,996 к усреднению в буфере. Я не вижу причин, по которым у вас не может быть больше двух фильтрованных элементов. Но ваш пробег будет меняться, поэтому вам придется экспериментировать, что лучше всего. [1] http://www.jstor.org/pss/3680063 – 2009-12-13 21:08:06

+0

Я отредактировал свой ответ, чтобы исправить мое недоразумение. – 2009-12-13 21:35:04

Смежные вопросы