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["D:\\MIDI\\"];

snd=ReadSoundfile["c1flets.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={-2000, 2000};

Zakres częstotliwoci analizy

CzMin=100;
CzMax=2000;

Dwięk w skali muzycznej (różnica w półtonach od a\(TraditionalForm\`\^1\))

Wys=-9;

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]]}; \)]]\)

Rzeczywista częstotliwoć podstawowa dwięku (generowana)

RzCzPodst = N[440 (( (2^Wys))^(1/12))];

Definicje funkcji przetwarzania sygnału

Funkcja detekcji przejcia przez wartoci progowe

\(\(ABE = 
      Function[sygnal, 
		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]; \)\)

Obliczenie częstotliwoci podstawowej

Obliczenie poszczególnych okresów sygnału

Okr = ABE[snd];

Obliczenie błędu ledzenia częstotliwoci podstawowej (w półtonach na okres)

\(Błšd = {}; 
Poprz = 0; 

    For[i = 1, i < Length[Okr], \(i++\), 
	
      If[Okr[[i, 2]] > 0, 
	
        AppendTo[Błšd, 
          RzCzPodst - 
            CzP\/\(Okr[[i, 1]] - Poprz
                \)]]; 
	
      Poprz = Okr[[i, 1]]; 
]; \)

ListPlot[Błšd, PlotStyle -> RGBColor[0, 0, 1], 
      PlotJoined -> True, PlotRange -> All];

Mean[Abs[Błšd]]

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[0, 0, 1], PointSize[0.004], 
              Point[{Okr[[i + 1, 1
                      ]]\/CzP, 
                  CzP\/\(Okr[[i + 1, 1
                        ]] - 
                      Okr[[i, 1
                        ]]\)}]}]]]]; \)

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

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];