Matlab: salvare i campioni che si ripetono ogni 300 ms

voti
0

Voglio campionare un segnale audio. Ho un file wav lungo 5 secondi. Voglio salvare i campioni ogni 300 ms. Io uso la funzione audioread in Matlab che diceva campioni che contengono nel file di, questo è il mio codice:

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

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

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

Come posso fare risparmiare in un array di campioni che si ripetono ogni 300 ms?

È pubblicato 24/10/2019 alle 12:01
fonte dall'utente
In altre lingue...                            


1 risposte

voti
1

Supponiamo che il wavfile ha una frequenza di campionamento di fs = 44100(che è abbastanza comune), vale a dire di avere 44100campioni al secondo. Ora, si vuole avere un campione ogni 0.3 s. Si deve calcolare il numero corrispondente di campioni "saltare" per quanto riguarda la frequenza di campionamento originale, vale a dire skip = 0.3 * fs = 13230in questo caso. Ora, si può semplicemente accedere a ciascun skip'esimo elemento in originale signal(e anche intervallo di tempo t).

Ecco il codice per fare il lavoro, e visualizzare il sopra:

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

Otteniamo il seguente risultato, il segnale originale è blu, i punti rossi sono i campioni a tutti 0.3 s:

Produzione

Se si dispone di uno sguardo t_new, si vede, che i punti di campionamento corrispondano perfettamente alla intervallo desiderato di 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

Spero che sia d'aiuto!

EDIT: C'è anche una resamplefunzione disponibile nella Signal Processing Toolbox . Non sono sicuro, se questa funzione è utile qui, dal momento che la nuova frequenza di campionamento sarebbe fs_new = 1 / 0.3 = 3.3333, ma resampleaccetta solo numeri interi. Forse, c'è un'altra funzione più sofisticata (toolbox) per fare il lavoro automaticamente.

Risposto il 24/10/2019 a 12:53
fonte dall'utente

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