Advertisement
Matthen

Pyknograms

Oct 11th, 2012
420
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. Hilbert[X_] := Module[{x, h, n = Length[X]},
  2. x = Fourier[X];
  3. h = Table[
  4. Piecewise[{{1, i == 1 || i == Floor[n/2] + 1}, {2,
  5. i <= Floor[n/2]}}], {i, n}];
  6. InverseFourier[h x][[;; n]]
  7. ];
  8. Unwrap[data_?VectorQ, tol_: Pi/2, inc_: 2 Pi] :=
  9. data + inc FoldList[Plus, 0,
  10. Sign[Chop[Apply[Subtract, Partition[data, 2, 1], {1}], tol]]];
  11. Freq[X_] := Module[{H = Hilbert[X], \[Phi]},
  12. \[Phi] = Unwrap[Arg@H];
  13. Block[{\[Sigma] = 4},
  14. ListConvolve[
  15. Table[-((E^(-(x^2/(2 \[Sigma]))) x)/(Sqrt[
  16. 2 \[Pi]] \[Sigma]^2)), {x, -2 \[Sigma],
  17. 2 \[Sigma], \[Sigma]/10}], \[Phi]]]
  18. ];
  19. Filter[X_, width_, sep_] :=
  20. Module[{x =
  21. PadRight[PadLeft[X, Floor[Length[X] + width/2], 10^-7],
  22. Floor[Length[X] + width], 10^-7]},
  23.  
  24. Table[(0.54 - 0.46 Cos[2 Pi i/(width - 1)]) x[[i + j sep]], {j, 0,
  25. Floor[(Length@x - width)/sep] - 1}, {i, 1, width}]
  26. ];
  27. FreqEstimate[fs_] := Module[{\[Mu], \[Sigma]},
  28. \[Mu] = Length[fs] Mean[fs^2*Range[Length[fs]]]/Total[fs^2];
  29. \[Sigma] = Total[(Range[Length[fs]] - \[Mu])^2 fs^2]/Total[fs^2];
  30. {\[Mu], \[Sigma]}
  31. ];
  32. Pyknos[X_] :=
  33. Module[{frames, ft, framewidth = 16000*0.025,
  34. framesep = 16000*0.01, n = Length[X], filterwidth = 50,
  35. filtersep = 5, out},
  36. frames = Filter[X, framewidth, framesep];
  37.  
  38. out = Map[
  39. Map[FreqEstimate,
  40. Filter[Abs[Fourier[#]][[;; Floor[framewidth/2]]], filterwidth,
  41. filtersep]] &
  42. ,
  43. frames];
  44. Map[Table[{filtersep (i - 1) - filterwidth/2, 0},
  45. {i, Length[out[[1]]]}] + # &
  46. , out]
  47. ];
  48. Spectrogram[X_] :=
  49. Module[{frames, ft, framewidth = 16000 *0.025,
  50. framesep = 16000*0.01, n = Length[X], filterwidth = 200,
  51. filtersep = 2, out},
  52. frames = Filter[X, framewidth, framesep];
  53.  
  54. out = Map[
  55. Abs[Fourier[#]][[;; Floor[framewidth/2]]] &
  56. ,
  57. frames]
  58. ];
  59. DownSample[l_, n_] := Table[l[[i]], {i, 1, Length@l, n}];
  60. voice = Import[
  61. "/Users/matt/Music/iTunes/iTunes Media/Music/Unknown \
  62. Artist/Unknown Album/mg436x-001-120416_231400_0001162_0001585.wav",
  63. "Data"];
  64. data = First[voice];
  65. spec = Reverse@Transpose@Spectrogram[data];
  66. pyk = Transpose@Pyknos[data];
  67. VariancePoly[l_, col_: Black] :=
  68. Module[{\[Mu] = First /@ l, \[Sigma] = Last /@ l,
  69. x = Range[Length@l]},
  70. {Opacity[0.05], col, Table[
  71. Polygon[
  72. Join[Transpose@{x, \[Mu] + i \[Sigma]/10},
  73. Reverse[Transpose@{x,
  74. Map[Max[0, #] &, \[Mu] - i \[Sigma]/10]}]]]
  75. , {i, 5}],
  76. Opacity[0.2], Black, Thick,
  77. Line[Transpose@{x, Map[Max[0, #] &, \[Mu]]}]
  78. }
  79. ];
  80. SimplePyk[l_, col_: Black] :=
  81. Module[{\[Mu] = First /@ l, \[Sigma] = Last /@ l,
  82. x = Range[Length@l]},
  83. {
  84. col, Line[Transpose@{x, Map[Max[0, #] &, \[Mu]]}]
  85. }
  86. ];
  87. pykplot =
  88. Graphics[{Table[
  89. VariancePoly[pyk[[i]][[110 ;; 300]],
  90. Blend[{Purple, RGBColor[0.1, 0.6, 0.2]}, i/20]], {i, 20}]},
  91. AspectRatio -> 0.4, PlotRange -> {0, 100}]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement