Created
January 4, 2016 11:29
-
-
Save fredyr/1f2a7373e37c44728bce to your computer and use it in GitHub Desktop.
Tiny biquad filter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(* | |
Tiny Biquad filter implementation in OCaml. | |
Ported straight from http://www.musicdsp.org/files/biquad.c | |
*) | |
type biquad = { | |
a0 : float; | |
a1 : float; | |
a2 : float; | |
a3 : float; | |
a4 : float; | |
mutable x1 : float; | |
mutable x2 : float; | |
mutable y1 : float; | |
mutable y2 : float; | |
} | |
(* Parametric EQ *) | |
let peq gain freq sample_rate bandwidth = | |
let pi = 3.1415926535897932384626433832795 in | |
let a = 10.0 ** (gain /. 40.0) in | |
let omega = 2.0 *. pi *. freq /. sample_rate in | |
let sn = sin(omega) in | |
let cs = cos(omega) in | |
let alpha = sn *. sinh((log 2.0) /. 2.0 *. bandwidth *. omega /. sn) in | |
let b0 = 1.0 +. (alpha *. a) in | |
let b1 = -2.0 *. cs in | |
let b2 = 1.0 -. (alpha *. a) in | |
let a0 = 1.0 +. (alpha /. a) in | |
let a1 = -2.0 *. cs in | |
let a2 = 1.0 -. (alpha /. a) in | |
{ a0 = b0 /. a0; | |
a1 = b1 /. a0; | |
a2 = b2 /. a0; | |
a3 = a1 /. a0; | |
a4 = a2 /. a0; | |
x1 = 0.; | |
x2 = 0.; | |
y1 = 0.; | |
y2 = 0.; | |
} | |
(* Biquad filter update function *) | |
let biquad_step b sample = | |
let result = b.a0 *. sample +. b.a1 *. b.x1 +. b.a2 *. b.x2 | |
-. b.a3 *. b.y1 -. b.a4 *. b.y2 in | |
b.x2 <- b.x1; | |
b.x1 <- sample; | |
b.y2 <- b.y1; | |
b.y1 <- result; | |
result | |
(* Sample filter usage *) | |
let p = peq 3. 100. 96000. 100. | |
let _ = biquad_step p 3.3, p |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.literal16 | |
.align 4 | |
_caml_negf_mask: .quad 0x8000000000000000, 0 | |
.align 4 | |
_caml_absf_mask: .quad 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF | |
.data | |
.globl _camlMain__data_begin | |
_camlMain__data_begin: | |
.text | |
.globl _camlMain__code_begin | |
_camlMain__code_begin: | |
nop | |
.data | |
.quad 3840 | |
.globl _camlMain | |
_camlMain: | |
.quad 1 | |
.quad 1 | |
.quad 1 | |
.data | |
.quad 4087 | |
_camlMain__16: | |
.quad _caml_curry2 | |
.quad 5 | |
.quad _camlMain__biquad_step_1035 | |
.data | |
.quad 4087 | |
_camlMain__17: | |
.quad _caml_curry4 | |
.quad 9 | |
.quad _camlMain__peq_1018 | |
.data | |
.quad 2045 | |
_camlMain__1: | |
.quad 0x400921fb54442d18 | |
.data | |
.globl _camlMain__2 | |
.quad 2045 | |
_camlMain__2: | |
.quad 0x4024000000000000 | |
.data | |
.globl _camlMain__3 | |
.quad 2045 | |
_camlMain__3: | |
.quad 0x4044000000000000 | |
.data | |
.globl _camlMain__4 | |
.quad 2045 | |
_camlMain__4: | |
.quad 0x4000000000000000 | |
.data | |
.globl _camlMain__5 | |
.quad 2045 | |
_camlMain__5: | |
.quad 0x401921fb54442d18 | |
.data | |
.globl _camlMain__6 | |
.quad 2045 | |
_camlMain__6: | |
.quad 0x3ff0000000000000 | |
.data | |
.globl _camlMain__7 | |
.quad 2045 | |
_camlMain__7: | |
.quad 0xc000000000000000 | |
.data | |
.globl _camlMain__8 | |
.quad 2045 | |
_camlMain__8: | |
.quad 0x0 | |
.data | |
.quad 2045 | |
_camlMain__9: | |
.quad 0x4008000000000000 | |
.data | |
.quad 2045 | |
_camlMain__10: | |
.quad 0x4059000000000000 | |
.data | |
.quad 2045 | |
_camlMain__11: | |
.quad 0x40f7700000000000 | |
.data | |
.quad 2045 | |
_camlMain__12: | |
.quad 0x4083a28c59d5433b | |
.data | |
.quad 2045 | |
_camlMain__13: | |
.quad 0x3f7acee9f37bebd6 | |
.data | |
.quad 2045 | |
_camlMain__14: | |
.quad 0x3fb3333333333333 | |
.data | |
.quad 2045 | |
_camlMain__15: | |
.quad 0x400a666666666666 | |
.text | |
.align 4 | |
.globl _camlMain__peq_1018 | |
_camlMain__peq_1018: | |
.cfi_startproc | |
subq $40, %rsp | |
.cfi_adjust_cfa_offset 40 | |
.L100: | |
movq %rdi, %r12 | |
movq %rsi, %r13 | |
movsd .L101(%rip), %xmm0 | |
movsd (%rax), %xmm1 | |
divsd %xmm0, %xmm1 | |
movsd .L102(%rip), %xmm0 | |
call _pow | |
movsd %xmm0, 16(%rsp) | |
movsd .L103(%rip), %xmm0 | |
mulsd (%rbx), %xmm0 | |
divsd (%r12), %xmm0 | |
movsd %xmm0, 0(%rsp) | |
call _sin | |
movsd %xmm0, 8(%rsp) | |
movsd 0(%rsp), %xmm0 | |
call _cos | |
movsd %xmm0, 24(%rsp) | |
movsd .L104(%rip), %xmm0 | |
call _log | |
movsd .L104(%rip), %xmm1 | |
divsd %xmm1, %xmm0 | |
mulsd (%r13), %xmm0 | |
movsd 0(%rsp), %xmm1 | |
mulsd %xmm1, %xmm0 | |
movsd 8(%rsp), %xmm1 | |
divsd %xmm1, %xmm0 | |
call _sinh | |
movsd 8(%rsp), %xmm2 | |
mulsd %xmm0, %xmm2 | |
movapd %xmm2, %xmm3 | |
movsd 16(%rsp), %xmm6 | |
mulsd %xmm6, %xmm3 | |
movsd .L105(%rip), %xmm4 | |
movapd %xmm4, %xmm1 | |
addsd %xmm3, %xmm1 | |
movsd .L106(%rip), %xmm0 | |
movsd 24(%rsp), %xmm5 | |
mulsd %xmm5, %xmm0 | |
movapd %xmm4, %xmm5 | |
subsd %xmm3, %xmm5 | |
divsd %xmm6, %xmm2 | |
movapd %xmm4, %xmm3 | |
addsd %xmm2, %xmm3 | |
subsd %xmm2, %xmm4 | |
.L107: subq $80, %r15 | |
movq _caml_young_limit@GOTPCREL(%rip), %rax | |
cmpq (%rax), %r15 | |
jb .L108 | |
leaq 8(%r15), %rax | |
movq $9470, -8(%rax) | |
divsd %xmm3, %xmm1 | |
movsd %xmm1, (%rax) | |
movapd %xmm0, %xmm1 | |
divsd %xmm3, %xmm1 | |
movsd %xmm1, 8(%rax) | |
divsd %xmm3, %xmm5 | |
movsd %xmm5, 16(%rax) | |
divsd %xmm3, %xmm0 | |
movsd %xmm0, 24(%rax) | |
divsd %xmm3, %xmm4 | |
movsd %xmm4, 32(%rax) | |
xorpd %xmm0, %xmm0 | |
movsd %xmm0, 40(%rax) | |
movsd %xmm0, 48(%rax) | |
movsd %xmm0, 56(%rax) | |
movsd %xmm0, 64(%rax) | |
addq $40, %rsp | |
.cfi_adjust_cfa_offset -40 | |
ret | |
.cfi_adjust_cfa_offset 40 | |
.L108: call _caml_call_gc | |
.L109: jmp .L107 | |
.cfi_endproc | |
.text | |
.align 4 | |
.globl _camlMain__biquad_step_1035 | |
_camlMain__biquad_step_1035: | |
.cfi_startproc | |
subq $8, %rsp | |
.cfi_adjust_cfa_offset 8 | |
.L110: | |
movq %rax, %rdi | |
movsd 32(%rdi), %xmm0 | |
mulsd 64(%rdi), %xmm0 | |
movsd 24(%rdi), %xmm1 | |
mulsd 56(%rdi), %xmm1 | |
movsd 16(%rdi), %xmm2 | |
mulsd 48(%rdi), %xmm2 | |
movsd 8(%rdi), %xmm3 | |
mulsd 40(%rdi), %xmm3 | |
movsd (%rdi), %xmm4 | |
mulsd (%rbx), %xmm4 | |
addsd %xmm3, %xmm4 | |
addsd %xmm2, %xmm4 | |
subsd %xmm1, %xmm4 | |
subsd %xmm0, %xmm4 | |
.L111: subq $16, %r15 | |
movq _caml_young_limit@GOTPCREL(%rip), %rax | |
cmpq (%rax), %r15 | |
jb .L112 | |
leaq 8(%r15), %rax | |
movq $1277, -8(%rax) | |
movsd %xmm4, (%rax) | |
movsd 40(%rdi), %xmm0 | |
movsd %xmm0, 48(%rdi) | |
movsd (%rbx), %xmm0 | |
movsd %xmm0, 40(%rdi) | |
movsd 56(%rdi), %xmm0 | |
movsd %xmm0, 64(%rdi) | |
movsd %xmm4, 56(%rdi) | |
addq $8, %rsp | |
.cfi_adjust_cfa_offset -8 | |
ret | |
.cfi_adjust_cfa_offset 8 | |
.L112: call _caml_call_gc | |
.L113: jmp .L111 | |
.cfi_endproc | |
.text | |
.align 4 | |
.globl _camlMain__entry | |
_camlMain__entry: | |
.cfi_startproc | |
subq $40, %rsp | |
.cfi_adjust_cfa_offset 40 | |
.L114: | |
movq _camlMain__17@GOTPCREL(%rip), %rax | |
movq _camlMain@GOTPCREL(%rip), %rbx | |
movq %rax, (%rbx) | |
movq _camlMain__16@GOTPCREL(%rip), %rax | |
movq %rax, 8(%rbx) | |
movsd .L115(%rip), %xmm1 | |
movsd .L102(%rip), %xmm0 | |
call _pow | |
movsd %xmm0, 16(%rsp) | |
movsd .L116(%rip), %xmm0 | |
movsd %xmm0, 0(%rsp) | |
call _sin | |
movsd %xmm0, 8(%rsp) | |
movsd 0(%rsp), %xmm0 | |
call _cos | |
movsd %xmm0, 24(%rsp) | |
movsd .L104(%rip), %xmm0 | |
call _log | |
movsd .L104(%rip), %xmm1 | |
divsd %xmm1, %xmm0 | |
movsd .L117(%rip), %xmm1 | |
mulsd %xmm1, %xmm0 | |
movsd 0(%rsp), %xmm1 | |
mulsd %xmm1, %xmm0 | |
movsd 8(%rsp), %xmm1 | |
divsd %xmm1, %xmm0 | |
call _sinh | |
movsd 8(%rsp), %xmm2 | |
mulsd %xmm0, %xmm2 | |
movapd %xmm2, %xmm3 | |
movsd 16(%rsp), %xmm6 | |
mulsd %xmm6, %xmm3 | |
movsd .L105(%rip), %xmm4 | |
movapd %xmm4, %xmm1 | |
addsd %xmm3, %xmm1 | |
movsd .L106(%rip), %xmm0 | |
movsd 24(%rsp), %xmm5 | |
mulsd %xmm5, %xmm0 | |
movapd %xmm4, %xmm5 | |
subsd %xmm3, %xmm5 | |
divsd %xmm6, %xmm2 | |
movapd %xmm4, %xmm3 | |
addsd %xmm2, %xmm3 | |
subsd %xmm2, %xmm4 | |
movq $120, %rax | |
call _caml_allocN | |
.L118: | |
leaq 8(%r15), %rax | |
movq $9470, -8(%rax) | |
divsd %xmm3, %xmm1 | |
movsd %xmm1, (%rax) | |
movapd %xmm0, %xmm1 | |
divsd %xmm3, %xmm1 | |
movsd %xmm1, 8(%rax) | |
divsd %xmm3, %xmm5 | |
movsd %xmm5, 16(%rax) | |
divsd %xmm3, %xmm0 | |
movsd %xmm0, 24(%rax) | |
divsd %xmm3, %xmm4 | |
movsd %xmm4, 32(%rax) | |
xorpd %xmm0, %xmm0 | |
movsd %xmm0, 40(%rax) | |
movsd %xmm0, 48(%rax) | |
movsd %xmm0, 56(%rax) | |
movsd %xmm0, 64(%rax) | |
movq _camlMain@GOTPCREL(%rip), %rbx | |
movq %rax, 16(%rbx) | |
movq 16(%rbx), %rdi | |
movsd 32(%rdi), %xmm0 | |
mulsd 64(%rdi), %xmm0 | |
movsd 24(%rdi), %xmm1 | |
mulsd 56(%rdi), %xmm1 | |
movsd 16(%rdi), %xmm2 | |
mulsd 48(%rdi), %xmm2 | |
movsd 8(%rdi), %xmm3 | |
mulsd 40(%rdi), %xmm3 | |
movsd .L119(%rip), %xmm4 | |
movapd %xmm4, %xmm5 | |
mulsd (%rdi), %xmm5 | |
addsd %xmm3, %xmm5 | |
addsd %xmm2, %xmm5 | |
subsd %xmm1, %xmm5 | |
subsd %xmm0, %xmm5 | |
leaq 80(%rax), %rsi | |
movq $1277, -8(%rsi) | |
movsd %xmm5, (%rsi) | |
movsd 40(%rdi), %xmm0 | |
movsd %xmm0, 48(%rdi) | |
movsd %xmm4, 40(%rdi) | |
movsd 56(%rdi), %xmm0 | |
movsd %xmm0, 64(%rdi) | |
movsd %xmm5, 56(%rdi) | |
addq $96, %rax | |
movq $2048, -8(%rax) | |
movq %rsi, (%rax) | |
movq 16(%rbx), %rbx | |
movq %rbx, 8(%rax) | |
movq $1, %rax | |
addq $40, %rsp | |
.cfi_adjust_cfa_offset -40 | |
ret | |
.cfi_adjust_cfa_offset 40 | |
.cfi_endproc | |
.data | |
.literal8 | |
.L119: .quad 0x400a666666666666 | |
.L117: .quad 0x4059000000000000 | |
.L116: .quad 0x3f7acee9f37bebd6 | |
.L115: .quad 0x3fb3333333333333 | |
.L106: .quad 0xc000000000000000 | |
.L105: .quad 0x3ff0000000000000 | |
.L104: .quad 0x4000000000000000 | |
.L103: .quad 0x401921fb54442d18 | |
.L102: .quad 0x4024000000000000 | |
.L101: .quad 0x4044000000000000 | |
.text | |
nop | |
.globl _camlMain__code_end | |
_camlMain__code_end: | |
.data | |
.globl _camlMain__data_end | |
_camlMain__data_end: | |
.long 0 | |
.globl _camlMain__frametable | |
_camlMain__frametable: | |
.quad 3 | |
.quad .L118 | |
.word 48 | |
.word 0 | |
.align 3 | |
.quad .L113 | |
.word 16 | |
.word 2 | |
.word 3 | |
.word 5 | |
.align 3 | |
.quad .L109 | |
.word 48 | |
.word 0 | |
.align 3 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment