Detekcja częstotliwoci podstawowej przy pomocy przetwarzania równoległego

Marek Szczerba, 2000

Inicjalizacja

Wczytanie bibliotek

\(<< Miscellaneous`Audio`
<< Statistics`DescriptiveStatistics`\)

Akwizycja sygnału

\(SetDirectory["D:\MIDI\"]; 

    snd = ReadSoundFile["mforts.wav"]; \)

Parametry definiowane przez użytkownika

Częstotliwoć próbkowania

CzP=22050;

Zakres częstotliwoci analizy

CzMin=120;
CzMax=2000;

Rozmiar ramki analizy

RM=200;

Próg szumowy

PrSz=-35;

Parametry wyznaczane automatycznie

Konwersja zakresu częstotliwoci na próbki

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

Detekcja maksymalnej wartoci próbki w sygnale

MaksPróbka = Max[Abs[snd]];

Definicje funkcji przetwarzania sygnału

Detektor cech sygnału

\(\(DetCech = 
      Function[{dane}, 
		
        M1 = \(M2 = 
            \(M3 = \(M4 = 
                \(M5 = \(M6 = Table[0, {fx, Length[dane]}]\)\)\)\)\); 
		
        minlok = 0; 
		poprzmin = 0; 
		makslok = 0; 
		
        poprzmaks = 0; 
		
        For[fi = 2, fi < Length[dane], \(fi++\), 
			
          If[dane[[fi]] > 
                dane[[fi - 1]] && 
              dane[[fi]] > 
                dane[[fi + 1]], 

            				poprzmaks = makslok; 
				
            makslok = dane[[fi]]; 

            				M1[[fi]] = makslok; 
            
				
            M2[[fi]] = makslok - minlok; 
            
				
            If[makslok - poprzmaks > 0, 
					
              M3[[fi]] = 
                makslok - poprzmaks]]; 
			
          If[dane[[fi]] < 
                dane[[fi - 1]] && 
              dane[[fi]] < 
                dane[[fi + 1]], 

            				poprzmin = minlok; 
				
            minlok = dane[[fi]]; 

            				M4[[fi]] = 
              \(-minlok\); 
				
            M5[[fi]] = 
              \(-\((minlok + makslok)\)\); 
				
            If[minlok - poprzmin < 0, 
					
              M6[[fi]] = 
                \(-\((minlok - poprzmin)\)\)]]]; 

        		{M1, M2, M3, M4, M5, M6}]; \)\)

Detekcja pierwszego maksimum wektora cech

\(\(Det1Max = 
      Function[cecha, 
		fmloc = 1; 
		fmmax = Max[cecha]; 
		
        For[fj = Length[cecha], fj >= 1, \(fj--\), 
			
          If[cecha[[fj]] > fmmax\/2, 
            fmloc = fj]]; 
		fmloc]; \)\)

Analiza skorelowania cech w ramkach

\(\(AnSk = 
      Function[{dane, sygnał}, 
		Wyjcie = {}; 
		
        For[fi = 1, 
          fi <= Length[dane[[1]]] - RM, 
          fi += RM, 
			fk = fi + RM; 
			Wy = Table[0, {fx, RM}]; 

          			frm = 
            Table[sygnał[[fx]], {
                fx, fi, fk}]; 
			maksfrm = Max[Abs[frm]]; 
			
          loclv = 20  Log[10, maksfrm\/MaksPróbka]; 
			
          If[loclv > PrSz, 
				
            fm1 = Table[
                dane[[1, fx]], {fx, fi, 
                  fk}]; 
				
            fm2 = Table[
                dane[[2, fx]], {fx, fi, 
                  fk}]; 
				
            fm3 = Table[
                dane[[3, fx]], {fx, fi, 
                  fk}]; 
				
            fm4 = Table[
                dane[[4, fx]], {fx, fi, 
                  fk}]; 
				
            fm5 = Table[
                dane[[5, fx]], {fx, fi, 
                  fk}]; 
				
            fm6 = Table[
                dane[[6, fx]], {fx, fi, 
                  fk}]; 
				fm1loc = Det1Max[fm1]; 
				
            fm2loc = Det1Max[fm2]; 
				fm3loc = Det1Max[fm3]; 
				
            fm4loc = Det1Max[fm4]; 
				fm5loc = Det1Max[fm5]; 
				
            fm6loc = Det1Max[fm6]; 
				
            For[fj = 1, fj <= Length[fm1] - fm1loc, \(fj++\), 
              Wy[[fj]] += 
                fm1[[fj + fm1loc - 1]]]; 
            			For[fj = 1, fj <= Length[fm2] - fm2loc, \(fj++\), 
              Wy[[fj]] += 
                fm2[[fj + fm2loc - 1]]]; 
            			For[fj = 1, fj <= Length[fm3] - fm3loc, \(fj++\), 
              Wy[[fj]] += 
                fm3[[fj + fm3loc - 1]]]; 
            			For[fj = 1, fj <= Length[fm4] - fm4loc, \(fj++\), 
              Wy[[fj]] += 
                fm4[[fj + fm4loc - 1]]]; 
            			For[fj = 1, fj <= Length[fm5] - fm5loc, \(fj++\), 
              Wy[[fj]] += 
                fm5[[fj + fm5loc - 1]]]; 
            			For[fj = 1, fj <= Length[fm6] - fm6loc, \(fj++\), 
              Wy[[fj]] += 
                fm6[[fj + fm6loc - 1
                    ]]]]; 
			
          AppendTo[Wyjcie, Wy]]; 
		Wyjcie]; \)\)

Detekcja częstotliwoci podstawowej

\(\(DetF0 = 
      Function[dane, 
		Wy = Table[0, {fx, Length[dane]}]; 
		
        For[fi = 1, fi <= Length[dane], \(fi++\), 
			
          fMaks = dane[[fi, 1]]; 

          		\ \ For[fj = OkrMin, fj <= OkrMax, \(fj++\), 
				
            If[dane[[fi, fj]] > 
                fMaks\/2, 
					
              Wy[[fi]] = CzP\/fj; 

              					Break[]]]]; 
		Wy]; \)\)

Definicja funkcji poprawnoci (Subscript[df, pr])

\(\(BłšdProc = 
      Function[dane, 
		OK = 0; 
		j = 1; 
		
        Błędzik = {}; 
		Liczba = Length[dane]; 
		
        For[i = 1, i < Liczba, \(i++\), 
				
          While[\(\((i - 1)\) RM + 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]] - 
              dane[[i]]]; 
			
          If[GrDolna < dane[[i]] && 
              dane[[i]] < 
                GrGórna, \(OK++\)]; 
			
          If[dane[[i]] == 0, 
            \(\(Liczba--\); \)]; ]; 
100  OK\/Liczba // N]; \)\)

Obliczenia

Obliczenie cech

Cechy = DetCech[snd];

Skorelowanie cech

Korel = AnSk[Cechy, snd];

Detekcja częstotliwoci podstawowej

FS = DetF0[Korel];

InS = 
      Table[{(((i - 1) RM + 1)/CzP), 
          FS[[i]]}, {i, Length[FS]}];

a = 
      ListPlot[InS, PlotJoined -> True, PlotStyle -> RGBColor[0, 0, 1], 
        PlotRange -> All];

Show[a, Graph];

Obliczenie błędu detekcji

Błšd = BłšdProc[FS]

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