Advertisement
Guest User

Untitled

a guest
Aug 29th, 2015
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. # create lowpass filter
  2. function create_lowpass_filter([System.Double]$samplerate, [System.Double]$freq, [System.Double]$reso){
  3. $s = [Math]::Tan( $freq * 3.14159265 / $samplerate )
  4. $t = $s / $reso
  5. $u = $s*$s + $t + 1.0
  6. $a0 = $s*$s/$u
  7. $a1 = 2.0*$s*$s / $u
  8. $a2 = $s*$s/$u
  9. $b1 = -2.0*($s*$s - 1.0)/$u
  10. $b2 = -($s*$s - $t + 1.0)/$u
  11. return @{
  12. a0 =$a0; a1 =$a1; a2 =$a2; b1 =$b1; b2 =$b2;
  13. in_z = 0.0; in_zz = 0.0; out_z = 0.0; out_zz = 0.0}
  14. }
  15.  
  16. # filter execute
  17. function filter_execute([System.Double]$in, $f){
  18. $denormal_canceler = 1.0e-100
  19. $out = $f.a0*$in + $f.a1*$f.in_z + $f.a2*$f.in_zz + $f.b1*$f.out_z + $f.b2*$f.out_zz
  20. $f.in_zz = $f.in_z + $denormal_canceler
  21. $f.in_z = $in + $denormal_canceler
  22. $f.out_zz = $f.out_z + $denormal_canceler
  23. $f.out_z = $out + $denormal_canceler
  24. return $out
  25. }
  26.  
  27. # SoX .dat format example
  28. #
  29. #; Sample Rate 48000
  30. #; Channels 2
  31. # 0 -0.45745626 -0.45745626
  32. # 2.0833333e-05 -0.3917995 -0.3917995
  33. # 4.1666667e-05 -0.067243849 -0.06724384
  34. # 6.25e-05 0.32710202 0.32710202
  35.  
  36. # parameter
  37. $freq = 1000.0
  38. $reso = 0.707
  39.  
  40. # read header
  41. $header = (Get-Content -TotalCount 2 "fa.dat")
  42. $samplerate, $channels = $header | foreach { ($_ -split "\s+")[-1]}
  43. if( $channels -ne 2 ){ return }
  44.  
  45. # create filter
  46. $filter1 = create_lowpass_filter $samplerate $freq $reso
  47. $filter2 = create_lowpass_filter $samplerate $freq $reso
  48.  
  49. # start
  50. $writer = [System.IO.File]::CreateText("fa2.dat")
  51. $header | foreach{ $writer.WriteLine($_) }
  52. [System.IO.File]::ReadLines("fa.dat") `
  53. | select -Skip 2 `
  54. | foreach { ,(-split $_) } `
  55. | foreach { $_[0] + " " + (filter_execute $_[1] $filter1) + " " + (filter_execute $_[2] $filter2) }`
  56. | foreach { $writer.WriteLine($_) }
  57. $writer.Close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement