Matlab: sparen monsters die elke 300 ms herhalen

stemmen
0

Ik wil een audiosignaal te bemonsteren. Ik heb een wav-bestand 5 seconden lang. Ik wil besparen monsters elke 300 ms. Ik gebruik de functie audioread in Matlab die monsters die in het dossier te lezen, dit is mijn code:

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

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

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

Hoe kan ik opslaan in een array monsters die worden herhaald elke 300 ms?

De vraag is gesteld op 24/10/2019 om 12:01
bron van user
In andere talen...                            


1 antwoorden

stemmen
1

Laten we aannemen dat uw wavbestand heeft een sampling rate van fs = 44100(dat is heel vaak), dat wil zeggen je hebt 44100samples per seconde. Nu, wilt u één monster elk 0.3 s. Je moet het overeenkomstige aantal monsters "skip" te berekenen met betrekking tot uw oorspronkelijke sampling rate, dat wil zeggen skip = 0.3 * fs = 13230in dit geval. Nu, kunt u eenvoudig toegang tot elkaar skip'de element in uw oorspronkelijke signal(en ook tijd interval t).

Hier is een code om het werk te doen, en te visualiseren het bovenstaande:

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

We krijgen de volgende uitvoer, het oorspronkelijke signaal is blauw, de rode punten zijn de monsters bij elke 0.3 s:

uitgang

Als u eens een kijkje op t_new, zie je, dat de meetpunten exact overeenkomen met het gewenste interval van 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

Hoop dat het helpt!

EDIT: Er is ook een resamplefunctie die beschikbaar is in het Signal Processing Toolbox . Ik ben niet zeker, als deze functie is handig hier, omdat de nieuwe sampling rate zou zijn fs_new = 1 / 0.3 = 3.3333, maar resampleaccepteert alleen gehele getallen. Misschien is er nog een meer geavanceerde (toolbox) functie om het werk te doen automatisch.

antwoordde op 24/10/2019 om 12:53
bron van user

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