Matlab: salva probe care se repetă la fiecare 300 ms

voturi
0

Vreau să eșantion un semnal audio. Am un fișier wav de 5 secunde. Vreau salva probe la fiecare 300 ms. Eu folosesc funcția audioread în Matlab care citesc probe care conțin în fișier, acesta este codul meu:

[signal,fs]=audioread('file.wav');

dt = 1/fs;
N = length(signal);
t = 0:dt:(N-1)*dt;

plot(t,signal)
ms=t*0.001;

Cum pot face salva într-o matrice de probe care se repetă la fiecare 300 ms?

Întrebat 24/10/2019 la 12:01
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
1

Să presupunem că dumneavoastră wavfișier are o rată de eșantionare de fs = 44100(care este destul de comună), adică aveți 44100eșantioane pe secundă. Acum, doriți să aveți un eșantion din fiecare 0.3 s. Trebuie să calculeze numărul corespunzător de probe pentru a „sări“ în ceea ce privește rata de eșantionare inițială, și anume , skip = 0.3 * fs = 13230în acest caz. Acum, puteți accesa pur și simplu , fiecare skip„th element original signal(și , de asemenea , intervalul de timp t).

Iată un exemplu de cod pentru a face munca și pentru a vizualiza cele de mai sus:

% Artificial data
signal = sin(linspace(0, 2*pi, 5 * 44100));
fs = 44100;
dt = 1 / fs;
N = length(signal); 
t = 0:dt:(N-1)*dt; 

% "Re-sampling" parameters
dt_new = 0.3; 
skip = dt_new * fs;

% Extract every skip'th value from original time interval and signal
t_new = t(1:skip:end).'
signal_new = signal(1:skip:end);

% Some visualization
figure(1);
hold on;
plot(t, signal);
plot(t_new, signal_new, 'r.', 'MarkerSize', 15);
hold off;

Obținem următoarea ieșire, semnalul original este albastru, punctele roșii sunt probele la fiecare 0.3 s:

producție

Dacă aveți o privire la t_new, vedeți, că punctele de prelevare se potrivesc exact intervalul dorit de 0.3 s:

t_new =
     0.00000
     0.30000
     0.60000
     0.90000
     1.20000
     1.50000
     1.80000
     2.10000
     2.40000
     2.70000
     3.00000
     3.30000
     3.60000
     3.90000
     4.20000
     4.50000
     4.80000

Sper că vă ajută!

EDIT: Există , de asemenea , o resamplefuncție disponibilă în Processing Toolbox Signal . Nu sunt sigur, în cazul în care această funcție este utilă aici, din moment ce rata de eșantionare nouă ar fi fs_new = 1 / 0.3 = 3.3333, dar resampleacceptă numai numere întregi. Poate, există un alt (set de instrumente) funcții mai sofisticate pentru a face treaba în mod automat.

Publicat 24/10/2019 la 12:53
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more