Matlab: salvar amostras que se repetem a cada 300 ms

votos
0

Eu quero provar um sinal de áudio. Eu tenho um arquivo wav 5 segundos de duração. Eu quero salvar amostras a cada 300 ms. Eu uso função audioread em Matlab que ler amostras contendo no arquivo, este é meu código:

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

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

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

Como posso fazer salvar em um amostras de matriz que se repetem a cada 300 ms?

Publicado 24/10/2019 em 12:01
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Vamos supor que seu wavarquivo tem uma taxa de amostragem de fs = 44100(que é bastante comum), ou seja, você tem 44100amostras por segundo. Agora, você quer ter uma amostra cada 0.3 s. Você tem que calcular o número correspondente de amostras a "pular" em relação à sua taxa de amostragem original, ou seja, skip = 0.3 * fs = 13230neste caso. Agora, você pode simplesmente acessar cada skip'th elemento em seu originais signal(e também intervalo de tempo t).

Aqui está algum código para fazer o trabalho, e visualizar o acima:

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

Ficamos com o seguinte resultado, o sinal original é azul, os pontos vermelhos são as amostras em cada 0.3 s:

Saída

Se você tiver uma olhada t_new, você vê, que os pontos de amostragem coincidir exatamente com o intervalo desejado 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

Espero que ajude!

EDIT: Há também uma resamplefunção disponível no Processing Toolbox Signal . Eu não tenho certeza, se esta função é útil aqui, já que a nova taxa de amostragem seria fs_new = 1 / 0.3 = 3.3333, mas resamplesó aceita números inteiros. Talvez, há uma outra função mais sofisticada (caixa de ferramentas) para fazer o trabalho automaticamente.

Respondeu 24/10/2019 em 12:53
fonte usuário

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