estoy tratando de hacer un espectrograma en matlab,
aquí está mi código:

% Record your voice for 100 seconds.
recObj = audiorecorder;
disp('Start speaking.')
recordblocking(recObj, 100);

% Store data in double-precision array.
my= getaudiodata(recObj);
figure;
specgram(my,512);

problema es que mientras estoy hablando yo quiero el espectrograma para ser mostrado, por lo que debería estar actualizando a medida que yo hablo. ¿Cómo puedo trazar el espectrograma, mientras que el audio desde el micrófono? así que debería ser capaz de ver espectrograma en tiempo real

También probé este

% Record your voice for 100 seconds.
recObj = audiorecorder;
disp('Start speaking.')
a=0;
figure;
while a<60
    recordblocking(recObj, 100);

    % Store data in double-precision array.
    my= getaudiodata(recObj);

    specgram(my,512);
    a=a+1;
end

pero sólo de mostrar el espectrograma cuando el bucle while peces (así que después de la ejecución de 60 veces)

  • No soy experto en matlab, pero no sólo se necesita de un bucle alrededor de las líneas 4 a 9? Por cierto, este es etiquetado como C, pero no veo la relación.
InformationsquelleAutor Rave | 2011-07-13

3 Comentarios

  1. 4

    He aquí una posible implementación. El principal problema fue que usted se olvide de llamar DRAWNOW al final de cada bucle:

    Fs = 8000;                    %# sampling frequency in Hz
    T = 1;                        %# length of one interval signal in sec
    t = 0:1/Fs:T-1/Fs;            %# time vector
    nfft = 2^nextpow2(Fs);        %# n-point DFT
    numUniq = ceil((nfft+1)/2);   %# half point
    f = (0:numUniq-1)'*Fs/nfft;   %'# frequency vector (one sided)
    %# prepare plots
    figure
    hAx(1) = subplot(211);
    hLine(1) = line('XData',t, 'YData',nan(size(t)), 'Color','b', 'Parent',hAx(1));
    xlabel('Time (s)'), ylabel('Amplitude')
    hAx(2) = subplot(212);
    hLine(2) = line('XData',f, 'YData',nan(size(f)), 'Color','b', 'Parent',hAx(2));
    xlabel('Frequency (Hz)'), ylabel('Magnitude (dB)')
    set(hAx, 'Box','on', 'XGrid','on', 'YGrid','on')
    %#specgram(sig, nfft, Fs);
    %# prepare audio recording
    recObj = audiorecorder(Fs,8,1);
    %# Record for 10 intervals of 1sec each
    disp('Start speaking...')
    for i=1:10
    recordblocking(recObj, T);
    %# get data and compute FFT
    sig = getaudiodata(recObj);
    fftMag = 20*log10( abs(fft(sig,nfft)) );
    %# update plots
    set(hLine(1), 'YData',sig)
    set(hLine(2), 'YData',fftMag(1:numUniq))
    title(hAx(1), num2str(i,'Interval = %d'))
    drawnow                   %# force MATLAB to flush any queued displays
    end
    disp('Done.')

    programación en matlab (cómo procesar en tiempo real)

    Yo simplemente mostrar los componentes de frecuencia en cada iteración. Usted debe ser capaz de modificar para mostrar el espectrograma si quieres…

  2. 6

    MATLAB es intrínsecamente un único subproceso. Sólo una cosa puede suceder en un momento. Esto hace que en tiempo real las tareas de cierta dificultad. Como usted señaló, recordblocking no devuelve el control a la secuencia de comandos hasta los 100 segundos. La clave está en la palabra el bloqueo de.

    La forma de evitar esto es con las devoluciones de llamada y sin bloqueo de funciones. El audiorecorder objeto tiene un par de métodos y propiedades que permiten este tipo de comportamiento.

    La audiorecorder propiedades:

    StartFcn: Establecer una función que se ejecutará al iniciar una asincronía en la grabación

    StopFcn: La función a ser ejecutada al detener una grabación

    TimerFcn: La función que se ejecuta cada TimerPeriod segundos durante una grabación.

    A continuación, el registro método comenzará la grabación y el proceso en el fondo, llamando a las funciones anteriores como se indica.

    Mediante la actualización periódica de sus datos en la función de devolución de llamada, usted puede actualizar su parcela. Por desgracia, esto es, del mismo modo no trivial para hacer de una manera eficiente que permite actualizaciones en vivo. Pero esto debe empezar.

    • ¿me puedes mostrar un pequeño ejemplo por favor
    • No voy a este código para usted. Esta es una cuestión amplia, y ofertas de hoteles con alguna de las más fundamentales de las técnicas de programación MATLAB. Por favor, lea a través de los enlaces de arriba (en particular, la Programa Fundamental de la Programación de la Documentación). Si usted tiene preguntas específicas en la implementación estoy seguro de que yo o alguien de aquí puede responder por ti. Pero StackOverflow no es un código de generación del sitio.
    • algo como esto. audio_recorder = audiorecorder(Fs, n_bits, n_channels); set(audio_recorder, myfunctionAtrecord); ? entiendo cómo crear (mediante la lectura del documento), pero no sé cómo llamarlo
    • yo lo hice aquí he publicado esto:stackoverflow.com/questions/6682073/…: ya no puedo código postal en el cuadro de comentario. cuando intento espectrograma, tengo la grabadora está vacía de error.
  3. 0

    La cosa más obvia que hacer es colocar el código en un bucle para mantener la actualización de la figura. Pero tenga en cuenta que Matlab no está realmente diseñado para este tipo de tarea, así que no sé cuánto éxito tendrá. Has probado a buscar en Google para el software libre que hace esto para usted? Me sorprendería si no había nada allí que no lo hizo ya.

    • lo sentimos, el pasado 3 días->he trabajado en C y no he dormido mucho. finalmente decidí cambiar a matlab, ya que se puede convertir en una .exe lo Siento por ella, editado.

Dejar respuesta

Please enter your comment!
Please enter your name here