.Wav рдлрд╝рд╛рдЗрд▓ рдХреА рддрд░рдВрдЧ рдбреНрд░рд╛ рдХрд░реЗрдВ



рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рджреЗрд╢реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдПрдХ рд▓рд╣рд░-рдлрд╛рдЗрд▓ рдХреА рдПрдХ рд▓рд╣рд░ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╕рдВрдкрд╛рджрдХ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдирддреАрдЬрддрди, рдореБрдЭреЗ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд┐рд▓реА рдЬреЛ рдЗрд╕реЗ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреА рд╣реИред рддреЛ, рдКрдкрд░ рдХреА рддрд╕реНрд╡реАрд░ рд░рд╛рдиреА рдХреЗ рдЧреАрдд "рдЕрдВрдбрд░ рдкреНрд░реЗрд╢рд░" рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рдереАред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдСрдбрд┐рдпреЛ рдПрдбрд┐рдЯрд░ рдореЗрдВ рддрд░рдВрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░:



рдореИрдВрдиреЗ рдзреНрд╡рдирд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдкреНрдкреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдФрд░ рдзреНрд╡рдирд┐ рдХреЛ рдкреНрд▓реЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдЯрдкреНрд▓реЛрдЯрд▓рд┐рдм ред рдХрдЯ рдХреЗ рддрд╣рдд, рдореИрдВ wav рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░реВрдВрдЧрд╛ред



UPD1: рдЧреБрдгрд╛рдВрдХ k рдХреЛ рдкрддрд▓рд╛ рдХрд░рдирд╛ рд▓рдЧрднрдЧ k = nframes / w / 32 рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдЕрдиреБрднрд╡рдЬрдиреНрдп рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рддред рдПрдХ рдирдП рдЧреБрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрд┐рдд рдЪрд┐рддреНрд░ред



WAV рдПрдХ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░реВрдк рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдореАрдбрд┐рдпрд╛ рдЙрджреНрдпреЛрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдмрд┐рдЯреНрд╕ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдЖрдпрд╛рдо рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░рдВрдЧ-рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╣реЗрдбрд░ рднрд╛рдЧ, рдПрдХ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдХрд╛рдп рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрдВрдЫ рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдБ рдСрдбрд┐рдпреЛ рд╕рдВрдкрд╛рджрдХ рдЕрдкрдирд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рд╣реЗрдбрд░ рднрд╛рдЧ рд╕реЗ рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ - рдЪреИрдирд▓ рдХреА рд╕рдВрдЦреНрдпрд╛, рдмрд┐рдЯ рджрд░, рдлрд╝реНрд░реЗрдо рдХреА рд╕рдВрдЦреНрдпрд╛ - рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗрд╡-рдлрд╛рдЗрд▓ 1 рдпрд╛ 2 рдЪреИрдирд▓ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ 8, 16, 24 рдпрд╛ 32 рдмрд┐рдЯреНрд╕ рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИред рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рддрд░рдВрдЧ рдХреЗ рдЖрдпрд╛рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдЯреНрд╕ рдХреЗ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдХ рдирдореВрдирд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдореЗрдВ рд╕рднреА рдЪреИрдирд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдирдореВрдиреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдХ рдлреНрд░реЗрдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, \ xe2 \ xff \ xe3 \ xfa 16-рдмрд┐рдЯ wav рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдлреНрд░реЗрдо рд╣реИред рдЗрд╕рд▓рд┐рдП, \ xe2 \ xff рдкрд╣рд▓реЗ (рдмрд╛рдПрдВ) рдЪреИрдирд▓ рдХрд╛ рдПрдХ рдирдореВрдирд╛ рд╣реИ, рдФрд░ \ xe3 \ xfa рджреВрд╕рд░рд╛ (рджрд╛рдПрдВ) рдЪреИрдирд▓ рд╣реИред рдирдореВрдиреЗ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛ (8-рдмрд┐рдЯ рдирдореВрдиреЗ, рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред



рдЕрдореАрд░ рдкрд╛рдпрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ wav рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░рдВрдЧ рдореЙрдбреНрдпреВрд▓ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдзреНрд╡рдирд┐ рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлреНрд░реЗрдо рдореЗрдВ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкрд░, рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред



import wave wav = wave.open("music.wav", mode="r") (nchannels, sampwidth, framerate, nframes, comptype, compname) = wav.getparams() content = wav.readframes(nframes)
      
      





рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо рд╡реЗрд╡-рдлрд╛рдЗрд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдк "рдЖрд░" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╣рдореЗрдВ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред рдЧреЗрдЯрдкрд░рд╛рдо () рд╡рд┐рдзрд┐ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рдЯрдкрд▓ рджреЗрддреА рд╣реИ (рдХреНрд░рдо рдореЗрдВ): рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдкреНрд░рддрд┐ рдирдореВрдирд╛ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдлреНрд░реЗрдо рдХреА рд╕рдВрдЦреНрдпрд╛, рдлреНрд░реЗрдо рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛, рд╕рдВрдкреАрдбрд╝рди рдкреНрд░рдХрд╛рд░, рд╕рдВрдкреАрдбрд╝рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдоред рдореИрдВрдиреЗ рдЙрди рд╕рднреА рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд░ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рд╣рд░ рдмрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рди рд╣реЛред



рд░реАрдбрдлрд╝реНрд░реЗрдо () рд╡рд┐рдзрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реНрд░реЗрдо рдХреЛ рдкрдврд╝рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрдврд╝рд╛рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЪрд░ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕рднреА рдлреНрд░реЗрдо рдкрдврд╝рддреЗ рд╣реИрдВред



рдЕрдм рдЖрдкрдХреЛ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реИрдореНрдкреЛрдЬрд╝рд┐рд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдореВрдиреЗ рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдореЗрдВ рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯреНрд╕ рд▓рдЧрддреЗ рд╣реИрдВ:



рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:



 import numpy as np types = { 1: np.int8, 2: np.int16, 4: np.int32 } samples = np.fromstring(content, dtype=types[sampwidth])
      
      





рдпрд╣ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп arrays рдФрд░ matrices рдХреЗ рд╕рд╛рде рдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рд╣реИред Numpy рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдлрд╝реЙрд░реНрд╕реНрдЯреНрд░рд┐рдВрдЧ () рдлрд╝рдВрдХреНрд╢рди рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдПрдХ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ dtype рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ "рдкреНрд░рдХрд╛рд░" рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдирдореВрдирд╛ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред



рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдирдореВрдиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред рдпрджрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдЪреИрдирд▓ рд╣реИ, рддреЛ рд╕рдВрдкреВрд░реНрдг рд╕рд░рдгреА рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧреА, рдпрджрд┐ рджреЛ (рдпрд╛ рдХрдИ) рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ n-рд╡реЗрдВ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ рд╕рд░рдгреА рдХреЛ "рдкрддрд▓рд╛" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:



 for n in range(nchannels): channel = samples[n::nchannels]
      
      





рдЗрд╕ рд▓реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдСрдбрд┐рдпреЛ рдЪреИрдирд▓ рдХреЛ рдлреЙрд░реНрдо [рдСрдлрд╕реЗрдЯ :: n] рдХреЗ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреИрдирд▓ рд╕рд░рдгреА рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдСрдлрд╕реЗрдЯ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ рдФрд░ n рдирдореВрдирд╛рдХрд░рдг рдЪрд░рдг рд╣реИред рд▓реЗрдХрд┐рди рдЪреИрдирд▓ рд╕рд░рдгреА рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдВрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ 3-рдорд┐рдирдЯ рдХреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд╝ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдФрд░ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ:

 duration = nframes / framerate w, h = 800, 300 DPI = 72 peak = 256 ** sampwidth / 2 k = nframes/w/32
      
      







рдЕрд╡рдзрд┐ рд╕реЗрдХрдВрдб рдореЗрдВ рдзрд╛рд░рд╛ рдХреА рдЕрд╡рдзрд┐ рд╣реИ, рдбрдмреНрд▓реНрдпреВ рдФрд░ рдПрдЪ рдЖрдЙрдЯрдкреБрдЯ рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рд╣реИ, рдбреАрдкреАрдЖрдИ рдПрдХ рдордирдорд╛рдирд╛ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдкрд┐рдХреНрд╕рд▓ рдХреЛ рдЗрдВрдЪ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╢рд┐рдЦрд░ рдирдореВрдирд╛ рдЖрдпрд╛рдо рдХрд╛ рдЪрд░рдо рдореВрд▓реНрдп рд╣реИ, рдХрд╢реНрдореАрд░ рдЪреИрдирд▓ рдерд░рдерд╛рдиреЗрд╡рд╛рд▓рд╛ рдЧреБрдгрд╛рдВрдХ рд╣реИ, рдЫрд╡рд┐ рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░; рдЖрдиреБрднрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рддред



рдЧреНрд░рд╛рдлрд╝ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ:

 plt.figure(1, figsize=(float(w)/DPI, float(h)/DPI), dpi=DPI) plt.subplots_adjust(wspace=0, hspace=0)
      
      





рдЕрдм рдЪреИрдирд▓реЛрдВ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рд▓реВрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 for n in range(nchannels): channel = samples[n::nchannels] channel = channel[0::k] if nchannels == 1: channel = channel - peak axes = plt.subplot(2, 1, n+1, axisbg="k") axes.plot(channel, "g") axes.yaxis.set_major_formatter(ticker.FuncFormatter(format_db)) plt.grid(True, color="w") axes.xaxis.set_major_formatter(ticker.NullFormatter())
      
      





рд▓реВрдк рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛, рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ 8-рдмрд┐рдЯ рдзреНрд╡рдирд┐ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдиреЗ рд╕реЗ рдЖрдзрд╛ рдЖрдпрд╛рдо рд▓реЗрдХрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред



рдЕрдВрдд рдореЗрдВ, рдирд┐рдЪрд▓реЗ рдЕрдХреНрд╖ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ

 axes.xaxis.set_major_formatter(ticker.FuncFormatter(format_time))
      
      





рдЪрд┐рддреНрд░ рдореЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рджрд┐рдЦрд╛рдПрдБ:

 plt.savefig("wave", dpi=DPI) plt.show()
      
      







format_time рдФрд░ format_db рдПрдмреНрд╕рд┐рд╕рд╛ рдФрд░ рдСрд░реНрдбрд┐рдиреЗрдЯ рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рддрд░рд╛рдЬреВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╣реИрдВред



format_time рдкреНрд░рд╛рд░реВрдк рд╕рдордп рдирдореВрдирд╛ рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛:

 def format_time(x, pos=None): global duration, nframes, k progress = int(x / float(nframes) * duration * k) mins, secs = divmod(progress, 60) hours, mins = divmod(mins, 60) out = "%d:%02d" % (mins, secs) if hours > 0: out = "%d:" % hours return out
      
      





Format_db рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдиреЗ рдЖрдпрд╛рдо рджреНрд╡рд╛рд░рд╛ рдзреНрд╡рдирд┐ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИ:

 def format_db(x, pos=None): if pos == 0: return "" global peak if x == 0: return "-inf" db = 20 * math.log10(abs(x) / float(peak)) return int(db)
      
      





рдкреВрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ:

 import wave import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as ticker import math types = { 1: np.int8, 2: np.int16, 4: np.int32 } def format_time(x, pos=None): global duration, nframes, k progress = int(x / float(nframes) * duration * k) mins, secs = divmod(progress, 60) hours, mins = divmod(mins, 60) out = "%d:%02d" % (mins, secs) if hours > 0: out = "%d:" % hours return out def format_db(x, pos=None): if pos == 0: return "" global peak if x == 0: return "-inf" db = 20 * math.log10(abs(x) / float(peak)) return int(db) wav = wave.open("music.wav", mode="r") (nchannels, sampwidth, framerate, nframes, comptype, compname) = wav.getparams() duration = nframes / framerate w, h = 800, 300 k = nframes/w/32 DPI = 72 peak = 256 ** sampwidth / 2 content = wav.readframes(nframes) samples = np.fromstring(content, dtype=types[sampwidth]) plt.figure(1, figsize=(float(w)/DPI, float(h)/DPI), dpi=DPI) plt.subplots_adjust(wspace=0, hspace=0) for n in range(nchannels): channel = samples[n::nchannels] channel = channel[0::k] if nchannels == 1: channel = channel - peak axes = plt.subplot(2, 1, n+1, axisbg="k") axes.plot(channel, "g") axes.yaxis.set_major_formatter(ticker.FuncFormatter(format_db)) plt.grid(True, color="w") axes.xaxis.set_major_formatter(ticker.NullFormatter()) axes.xaxis.set_major_formatter(ticker.FuncFormatter(format_time)) plt.savefig("wave", dpi=DPI) plt.show()
      
      





рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг:










All Articles