Multimediální technologie – Cvičení 2

Zadání

  1. Vytvořte funkci pro načítání nekomprimovaného wavu (různá vzorkovací frekvence, různý počet bitů na jeden vzorek, počet kanálů). Funkce by měla hlásit chybu v případě nekompletního
    souboru nebo souboru, který není RIFF, WAVE,6. Jednotlivé kanály zobrazujte do samostatných oken
  2. Načtěte a otestujte wavy: cv02_wav_01.wav až cv02_wav_06.wav

Soubory


Ř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
        data = f.read(4)
        if data == 'RIFF':
            #Pocet bytu do konce souboru
            A1 = struct.unpack('I', f.read(4))[0]

            #Format nacitaneneho souboru
            file_format = f.read(4)

            if file_format == 'WAVE':
                #Format
                fmt =  f.read(4)

                #Pocet bytu do konce casti Format
                AF = struct.unpack('I', f.read(4))[0]

                #Format
                K = struct.unpack('H', f.read(2))[0]

                #Pocet kanalu
                C = struct.unpack('H', f.read(2))[0]
                #print 'Pocet kanalu: ' + str(C)

                #Vzorkovaci frekvence
                VF = struct.unpack('I', f.read(4))[0]
                #print 'Vzorkovaci frekvence: ' + str(VF) + 'Hz'

                #Prumerny pocet bytu za sec
                PB = struct.unpack('I', f.read(4))[0]

                #Velikost bloku
                VB = struct.unpack('H', f.read(2))[0]
                #print 'Velikost bloku: ' + str(VB) + 'B'

                #Velikost vzorku
                VV = struct.unpack('H', f.read(2))[0]
                #print 'Velikost vzorku: ' + str(VV) + 'B'

                f.read(4)

                #data
                # A2 = Pocet bytu do konce
                A2 = struct.unpack('I', f.read(4))[0]
                sigs = []
                for i in range(0, C):
                    SIG = np.zeros((A2/C)/(VV/8))
                    sigs.append(SIG)
                try:
                    for i in range(0, (A2/C)/(VV/8)):
                        for j in range(0, C):
                            if VV == 8:
                                sigs[j][i] = struct.unpack('B', f.read(1))[0]
                            elif VV == 16:
                                sigs[j][i] = struct.unpack('h', f.read(2))[0]
                            elif VV == 32:
                                sigs[j][i] = struct.unpack('i', f.read(4))[0]
                except:
                    raise Exception('ERR: Soubor je poskozeny!')

                plt.figure(1)
                for i in range(0, C):
                    t = np.arange(((A2/C)/(VV/8))).astype(float)/VF
                    plt.subplot(2,2,i+1)
                    plt.plot(t, sigs[i])
                    plt.xlabel('t[s]')
                    plt.ylabel('A[-]')
                plt.show()

            else:
                raise IOError('ERR: Soubor neni WAVE!')
        else:
            raise IOError('ERR: Soubor neni RIFF!')


if __name__ == "__main__":
    try:
        read_file('cv02_wav_01.wav')
        read_file('cv02_wav_02.wav')
        read_file('cv02_wav_03.wav')

        #ODKOMENTUJE PRO VYZKOUSENI
        #Soubor cv02_wav_04 neni WAVE
        #read_file('cv02_wav_04.wav')

        #Soubor cv02_wav_05 neni RIFF
        #read_file('cv02_wav_05.wav')

        #Soubor cv02_wav_06 je poskozeny
        #read_file('cv02_wav_06.wav')
    except IOError as err:
        print err.message

You may also like...

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *