Metody progowe

Inicjalizacja

Dołšczenie bibliotek

Biblioteka obsługi dwięku

<< Miscellaneous`Audio`

Biblioteka statystyczna

<< Statistics`DescriptiveStatistics`

Biblioteka przetwarzania sygnału

Needs["SignalProcessing`"]

Akwizycja sygnału

SetDirectory["\\\\Marek\\D\\MIDI\\"];

snd=ReadSoundfile["mforts.wav", PrintHeader -> True];

Parametry pracy

Parametry definiowane przez użytkownika

Częstotliwoć próbkowania

CzP=22050;

Definicja wartoci progowych

Zmienna Progi przyjmuje wartoć:
- {0} dla metody ZXABE,
- {a} dla metody TABE,
- {a, b} dla metody TTABE.

Progi={0};

Zakres częstotliwoci analizy

CzMin=100;
CzMax=2000;

Parametry wyznaczane automatycznie

Konwersja zakresu częstotliwoci na próbki

\(OkrMin = Ceiling[CzP\/CzMax]; 
OkrMax = Floor[CzP\/CzMin]; \)

Uporzšdkowanie wartoci progowych

\(If[Length[Progi] > 1, 
	Progi = Sort[Progi]; 
	
      If[Progi[[1]] == 
          Progi[[2]], 
        \(Progi = {Progi[[1]]}; \)]]\)

Definicje funkcji przetwarzania sygnału

Funkcja detekcji przejcia przez wartoci progowe

\(\(ABE = 
      Function[{sygnal, progi}, 
		Wynik = {}; 
		MaxAmp = 0; 
		
        Poprz = 0; 
		
        If[Length[progi] > 1, 
			Dwa = True, 
			Dwa = False]; 
		
        Flaga = False; 
		
        For[i = 1, i < Length[sygnal], \(i++\), 
			
          If[Abs[sygnal[[i]]] > MaxAmp, 
            MaxAmp = Abs[sygnal[[i]]]]; 
          
			If[Dwa, 
				
            If[Sign[sygnal[[i]] - 
                    progi[[2]]] > 
                Sign[sygnal[[i + 1]] - 
                    progi[[2]]], 

              						Flaga = True]]; 
			
          If[Sign[sygnal[[i]] - 
                  progi[[1]]] < 
              Sign[sygnal[[i + 1]] - 
                  progi[[1]]], 
				
            If[i - Poprz >= OkrMin, 
					
              If[i - Poprz > OkrMax, MaxAmp = 0]; 
					
              If[Dwa && Flaga, 
						AppendTo[Wynik, {i, MaxAmp}]; 

                						Poprz = i; 
						Flaga = False; 

                						MaxAmp = 0]; 
					
              If[\(! Dwa\), 
						AppendTo[Wynik, {i, MaxAmp}]; 

                						Poprz = i; 
						MaxAmp = 0]]]]; 
	
        Wynik]; \)\)

Pomiar poprawnoci detekcji

\(\(BłšdProc = 
      Function[dane, 
		OK = 0; 
		j = 1; 
		
        Błędzik = {}; 
		Liczba = Length[dane]; 
		
        For[i = 1, i < Liczba, \(i++\), 
				
          While[dane[[i + 1, 1]]\/CzP > 
                Fraza[[j, 2]] && 
              j < Length[Fraza], \(\(j++\); \)]; 
			
          GrDolna = 
            Fraza[[j, 1]] 
              \@\(2\^\(-1\)\)\%12; 
			
          GrGórna = 
            Fraza[[j, 1]] 
              \@\(2\^1\)\%12; 
			
          AppendTo[Błędzik, 
            Fraza[[j, 1]] - 
              CzP\/\(dane[[i + 1, 1]] - 
                  dane[[i, 1]]\)]; 

          			If[
            GrDolna < 
                CzP\/\(dane[[i + 1, 1
                      ]] - 
                    dane[[i, 1]]\) && 
              CzP\/\(dane[[i + 1, 1]] - 
                    dane[[i, 1]]\) < 
                GrGórna, \(OK++\)]; 
			
          If[dane[[i + 1, 2]] == 0, 
            \(\(Liczba--\); \)]; ]; 
100  OK\/Length[Okr] // N]; \)\)

Obliczenia

Obliczenie częstotliwoci podstawowej sygnału

Obliczenie poszczególnych okresów sygnału

Okr = ABE[snd, Progi];

BłšdProc[Okr]

\(\(	Timing[
	MaxEpr = 0; 
	NProg = {0, 0}; 
	p = 2000; 
	
      While[p >= 10, 
		Print["Dokładnoć=", p]; 

        		Srodek = NProg[[1]]; 
		
        For[z = Srodek - 10  p, z <= Srodek + 10  p, z += p, 
				
          Okr = ABE[
              snd, {z, NProg[[2]]}]; 

          				Epr = BłšdProc[Okr]; 
				
          If[Epr > MaxEpr || 
              \((Epr == MaxEpr && 
                  Abs[z] < 
                    Abs[NProg[[1]]])\), 
            
					MaxEpr = Epr; 
					
            NProg[[1]] = z; ]; 
				
          Print["Próg=", z, 
            "    Dokładnoć=", Epr]; ]; 
		
        p = p/10; ]; 
p = 2000; 
	
      While[p >= 10, 
		Print["Dokładnoć=", p]; 

        		Srodek = NProg[[2]]; 
		
        For[z = Srodek - 10  p, z <= Srodek + 10  p, z += p, 
				
          Okr = ABE[
              snd, {NProg[[1]], z}]; 

          				Epr = BłšdProc[Okr]; 
				
          If[Epr > MaxEpr || 
              \((Epr == MaxEpr && 
                  Abs[z] < 
                    Abs[NProg[[2]]])\), 
            
					MaxEpr = Epr; 
					
            NProg[[2]] = z; ]; 
				
          Print["Próg=", z, 
            "    Dokładnoć=", Epr]; ]; 
		
        p = p/10; ]; 
	{NProg, MaxEpr}
]\)\)

MaxEpr

NProg

Przygotowanie tabeli zawierajšcej wykresy częstotliwoci podstawowej poszczególnych okresów sygnału

\(Wykresy = {}; 

    For[i = 1, i < Length[Okr], \(i++\), 
	
      If[Okr[[i, 2]] > 0, 
		
        AppendTo[Wykresy, 
          Graphics[{
              RGBColor[
                \(-Sign[Okr[[i + 1, 2]]]
                      \) + 1, 
                \(-Sign[Okr[[i + 1, 2]]]
                      \) + 1, 1], PointSize[0.004], 
              Point[{Okr[[i + 1, 1
                      ]]\/CzP, 
                  CzP\/\(Okr[[i + 1, 1
                        ]] - 
                      Okr[[i, 1
                        ]]\)}]}]]]]; \)

Show[{Wykresy, Graph}, Frame -> True,  PlotRange -> All];

\(\(ListPlot[Błędzik, PlotStyle -> RGBColor[1, 0, 0]]; 
    \)\)

Rekonstrukcja sygnału

\(Wy = {}; 
Poprz = 0; 

    For[i = 1, i <= Length[Okr], \(i++\), 
	
      A = Sign[Okr[[i, 2]]]; 
	
      AppendTo[Wy, 
        Table[A*Sin[j], {j, 
            N[\(2  π\)\/\(Okr[[i, 1
                    ]] - Poprz\)], 2  π, 
            N[\(2  π\)\/\(Okr[[i, 1
                    ]] - Poprz\)]}]]; 
	
      Poprz = Okr[[i, 1]]]; 

    Wy = Flatten[Wy]; \)

ListPlay[Wy, SampleRate -> CzP, PlayRange -> All];