Skip to content

Instantly share code, notes, and snippets.

@fredyr
Created January 4, 2016 11:29
Show Gist options
  • Save fredyr/1f2a7373e37c44728bce to your computer and use it in GitHub Desktop.
Save fredyr/1f2a7373e37c44728bce to your computer and use it in GitHub Desktop.
Tiny biquad filter
(*
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
.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