Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # create lowpass filter
- function create_lowpass_filter([System.Double]$samplerate, [System.Double]$freq, [System.Double]$reso){
- $s = [Math]::Tan( $freq * 3.14159265 / $samplerate )
- $t = $s / $reso
- $u = $s*$s + $t + 1.0
- $a0 = $s*$s/$u
- $a1 = 2.0*$s*$s / $u
- $a2 = $s*$s/$u
- $b1 = -2.0*($s*$s - 1.0)/$u
- $b2 = -($s*$s - $t + 1.0)/$u
- return @{
- a0 =$a0; a1 =$a1; a2 =$a2; b1 =$b1; b2 =$b2;
- in_z = 0.0; in_zz = 0.0; out_z = 0.0; out_zz = 0.0}
- }
- # filter execute
- function filter_execute([System.Double]$in, $f){
- $denormal_canceler = 1.0e-100
- $out = $f.a0*$in + $f.a1*$f.in_z + $f.a2*$f.in_zz + $f.b1*$f.out_z + $f.b2*$f.out_zz
- $f.in_zz = $f.in_z + $denormal_canceler
- $f.in_z = $in + $denormal_canceler
- $f.out_zz = $f.out_z + $denormal_canceler
- $f.out_z = $out + $denormal_canceler
- return $out
- }
- # SoX .dat format example
- #
- #; Sample Rate 48000
- #; Channels 2
- # 0 -0.45745626 -0.45745626
- # 2.0833333e-05 -0.3917995 -0.3917995
- # 4.1666667e-05 -0.067243849 -0.06724384
- # 6.25e-05 0.32710202 0.32710202
- # parameter
- $freq = 1000.0
- $reso = 0.707
- # read header
- $header = (Get-Content -TotalCount 2 "fa.dat")
- $samplerate, $channels = $header | foreach { ($_ -split "\s+")[-1]}
- if( $channels -ne 2 ){ return }
- # create filter
- $filter1 = create_lowpass_filter $samplerate $freq $reso
- $filter2 = create_lowpass_filter $samplerate $freq $reso
- # start
- $writer = [System.IO.File]::CreateText("fa2.dat")
- $header | foreach{ $writer.WriteLine($_) }
- [System.IO.File]::ReadLines("fa.dat") `
- | select -Skip 2 `
- | foreach { ,(-split $_) } `
- | foreach { $_[0] + " " + (filter_execute $_[1] $filter1) + " " + (filter_execute $_[2] $filter2) }`
- | foreach { $writer.WriteLine($_) }
- $writer.Close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement