2015-12-30 3 views
0

Если бы я хотел запрограммировать кривые различных звуковых фильтров, какие инструменты я должен использовать для их создания в холсте?Воспроизведение кривых звукового фильтра в холсте html5

http://raider.mountunion.edu/~miskeljp/ds/resources/filters/filter_types.jpg

Мои идеи:

  • quadraticCurveTo
  • bezierCurveTo
  • пользовательских кривой с использованием Math.sin

Поскольку я все еще не хватает опыта, я надеюсь, что кто-то мог скажите мне, какой будет лучший aproach.

ответ

2

Квадратичные, безьевые и синусоидальные кривые не будут хорошо соответствовать кривой фильтра. Их можно спорить, но я не рекомендую.

Если эти кривые должны быть динамическими, я рекомендую найти фактические функции для фильтров и использовать lineTo (x, y) столько раз, сколько вы сочтете нужным.

Если у вас есть математическая функция, запрограммированная в javascript-функцию, вы можете сделать следующее.

context.beginPath(); 
for(var i = startX; i<endX; i++) 
    context.lineTo(i, myCurve(i)); 
context.lineWidth = 5; 
context.strokeStyle = 'black'; 
context.stroke(); 

Единственная причина, по которой это не делается, заключается в том, что вы беспокоитесь о проблемах с производительностью или о том, что ваш холст очень большой.

Если это так, вероятно, вы должны использовать предварительно вычисленную кривую. Кривые Безье хорошо работают для такого рода работ.

Если вам нужна динамика кривой и у вас есть вышеупомянутые проблемы с производительностью, вам нужно найти математика и выяснить, как сопоставить независимые функции кривым Безье. Это можно сделать, но для этого требуется довольно много алгебры.

+0

Я нашел формулу для фильтра высоких частот, но я не думаю, что любая из этих подсказок в этом контексте https://en.wikipedia.org/wiki/High-pass_filter – Asperger

+0

Я что-то нашел! https://en.wikipedia.org/wiki/Filter_(signal_processing) – Asperger

+0

Я думаю, что вы правы. Это большой объем работы. Я думаю, что beziercurves являются самыми близкими, которые я могу получить тогда. Это не будет точно, но, по крайней мере, будет выглядеть похожим. По меньшей мере, фильтры с высоким и низким пропусканием можно эмулировать. Изменение Q (ширина полосы) немного сложно запрограммировать динамически. Несколько эмулирующих кривых с грехом хорошо работает, хотя http://jsfiddle.net/5v4judqf/5/, особенно изменяя Q (ширина полосы) – Asperger

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