Matlab: σώσει τα δείγματα που επαναλαμβάνονται κάθε 300 ms

ψήφοι
0

Θέλω να δοκιμάσετε ένα ηχητικό σήμα. Έχω ένα αρχείο wav μήκους 5 δευτερόλεπτα. Θέλω να σώσει δείγματα κάθε 300 ms. Μπορώ να χρησιμοποιήσω τη λειτουργία audioread σε Matlab που διαβάζουν τα δείγματα που περιέχουν το αρχείο, αυτό είναι κωδικός μου:

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

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

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

Πώς μπορώ να κάνω εκτός από ένα δείγματα σειρά που επαναλαμβάνονται κάθε 300 ms;

Δημοσιεύθηκε 24/10/2019 στις 12:01
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
1

Ας υποθέσουμε ότι σας wavαρχείο έχει ένα ρυθμό δειγματοληψίας fs = 44100(η οποία είναι αρκετά κοινό), δηλαδή έχετε 44100δείγματα ανά δευτερόλεπτο. Τώρα, θέλετε να έχετε ένα δείγμα κάθε 0.3 s. Θα πρέπει να υπολογίσει τον αντίστοιχο αριθμό δειγμάτων για να «skip» σε σχέση με το αρχικό ρυθμό δειγματοληψίας σας, δηλαδή skip = 0.3 * fs = 13230στην προκειμένη περίπτωση. Τώρα, μπορείτε απλά να αποκτήσετε πρόσβαση σε κάθε skip«ου στοιχείο στην αρχική σας signal(και χρονικό διάστημα t).

Εδώ είναι μερικά κωδικό για να κάνει τη δουλειά, και να απεικονίσει τα παραπάνω:

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

Έχουμε πάρει το ακόλουθο αποτέλεσμα, το αρχικό σήμα είναι μπλε, τα κόκκινα σημεία είναι τα δείγματα σε κάθε 0.3 s:

Παραγωγή

Αν έχετε μια ματιά t_new, θα δείτε, ότι τα σημεία δειγματοληψίας ταιριάζει ακριβώς επιθυμητό διάστημα σας 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

Ελπίδα που βοηθά!

EDIT: Υπάρχει επίσης μια resampleλειτουργία διαθέσιμη στο Signal Processing Toolbox . Δεν είμαι σίγουρος αν αυτή η λειτουργία είναι χρήσιμη εδώ, αφού το νέο ρυθμό δειγματοληψίας θα είναι fs_new = 1 / 0.3 = 3.3333, αλλά resampleδέχεται μόνο ακέραιους αριθμούς. Ίσως, υπάρχει ένα άλλο πιο εξελιγμένο (εργαλειοθήκη) για να κάνει τη δουλειά αυτόματα.

Απαντήθηκε 24/10/2019 στις 12:53
πηγή χρήστη

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