Multimediální technologie – Cvičení 1


Zadání

Nutná softwarová výbava

  • Python 2.7.X
  • PyCharm – Vývojové prostředí.
  • PyQt – Podpora grafického rozhraní.
  • Scipy-stack – Algoritmy lineární algebry, vykreslování grafů, zpracování signálů…
  • opencv-python – Alhoritmy pro načítání a zpracování obrazu.
  • scikit-learn – Algoritmy strojového učení a rozpoznávání (PCA, …).

Úkol

Načtěte binární soubor *. wav.

Soubory

Užitečné

Ukázka načtení binárního souboru *.wav

import numpy as np
import matplotlib.pyplot as plt
import struct
with open('cv01_dobryden.wav', 'rb') as f:
   #head
   data = f.read(4)
   print data
   A1 = struct.unpack('i', f.read(4))[0]
   print A1
   ...
   #data
   SIG = np.zeros(A2)
   for i in range(0, A2):
      SIG[i] = struct.unpack('B', f.read(1))[0]
t = np.arange(A2).astype(float)/VF
plt.plot(t, SIG)
plt.xlabel('t[s]')
plt.ylabel('A[-]')

Hlavička binárního souboru *.wav

Hlavička binárního souboru *.wav

Hlavička binárního souboru *.wav

  • (1-4B) řetězec „RIFF“ (Resource Interchange File Format)
  • (5-8B) A1-počet bytů do konce souboru (A1=velikost souboru-8d)
  • (9-12B) řetězec „WAVE“
  • (13-16B) řetězec „fmt “
  • (17-20B) AF-počet bytů do konce části FORMAT
  • (21-22B) K-kategorie formátu (komprese)

0000h-WAVE_FORMAT_UNKNOW 0001h-WAVE_FORMAT_PCM

0002h-WAVE_FORMAT_ADPCM 0005h-WAVE_FORMAT_IBM_CVSD

0006h-WAVE_FORMAT_ALAW 0007h-WAVE_FORMAT_MULAW

  • (23-24B) C-počet kanálů
  • (25-28B) VF-vzorkovací frekvence [Hz]
  • (29-32B) PB-průměrný počet bytů za sekundu
  • (33-34B) VB-velikost bloku vzorků [B]
  • (35-36B) VV-velikost vzorku [b]
  • (37-40B) řetězec „data”
  • (41-44B) A2-počet bytů do konce souboru
Příklad
Příklad hlavičky binárního souboru *.wav

Příklad hlavičky binárního souboru *.wav

  • (5-8) A1 = 0000BCE7h = 48 359d (zk: 48359+8=48 367)
  • (17-20) AF = 00000010h = 16d
  • (21-22) K = 0001h (WAVE_FORMAT_PCM)
  • (23-24) C = 0001h, počet kanálů = 1
  • (25-28) VF = 00003E80h = 16000d Hz
  • (29-32) PB = 00007D00h = 32000d Hz
  • (33-34) VB = 0002h = 2B
  • (35-36) VV = 0010h = 16b
  • (41-44) A2 = 0000BCC3h = 48 323d (zk: 48 323+44=48 367)

Pozn.: V hlavičce mohou být i jiné nepovinné části (fact, cue-points, play-list, associated data).


Řešení

# -*- coding: utf-8 -*-
import os
import numpy as np
import matplotlib.pyplot as plt
import struct

clear = lambda: os.system('cls')
clear()
plt.close('all')

def read_file(file_name):
    with open(file_name, 'rb') as f:
        #Head
        #(1-4B) Retezec "RIFF"
        RIFF = f.read(4)
        print RIFF

        #(5-8B) A1 = pocet bitu do konce souboru
        A1 = struct.unpack('i', f.read(4))[0]
        print A1

        #(9-12B) Retezec "WAVE"
        WAVE = f.read(4)
        print WAVE

        #(13-16B) Retezec "fmt"
        fmt = f.read(4)
        print fmt

        #(17-20B) AF = Pocet bytu do konce casti FORMAT
        AF = struct.unpack('i', f.read(4))[0]
        print AF

        #(21-22B) K = kategorie formatu (komprese)
        K = f.read(2)
        #print K

        #(23-24B) C = Pocet kanalu
        C = f.read(2)
        #print C

        #(25-28B) VF = Vzorkovaci frekvence [Hz]
        VF = struct.unpack('i', f.read(4))[0]
        print VF

        #(29-32B) PB = Prumerny pocet bytu za sekundu
        PB = struct.unpack('i', f.read(4))[0]
        print PB

        #(33-34B) VB = Velikost bloku vzorku [B]
        VB = f.read(2)
        #print(VB)

        #(35-36B) VV = Velikost vzorku [b]
        VV = f.read(2)
        #print VV

        #(37-40) Retezec "data"
        data = f.read(4)
        print data

        #(41-44B) A2 = Pocet bytu do konce souboru
        A2 = struct.unpack('i', f.read(4))[0]
        print A2

        #Data
        SIG = np.zeros(A2)
        for i in range(0, A2):
            SIG[i] = struct.unpack('B', f.read(1))[0]
        t = np.arange(A2).astype(float)/VF

    plt.plot(t, SIG)
    plt.xlabel('t[s]')
    plt.ylabel('A[-]')
    plt.show()

if __name__ == "__main__":
    read_file('cv01_dobryden.wav')

Napsat komentář