0% encontró este documento útil (0 votos)
103 vistas54 páginas

Análisis Espectral de Datos de Audio y Sensor

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
103 vistas54 páginas

Análisis Espectral de Datos de Audio y Sensor

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

PRACTICA CALIFICADA N°4

Table of Contents
PREGUNTA 1........................................................................................................................................................... 1
PREGUNTA 2....................................................................................................................................................... 2
PREGUNTA 3....................................................................................................................................................... 8
PREGUNTA 4..................................................................................................................................................... 45

PREGUNTA 1

load sensorlog_20190714.mat
data = Acceleration;

% Remuestrear los datos a 50 Hz utilizando retime


dataResampled = retime(data, 'regular', 'linear', 'SampleRate', 50);

% Filtrar los datos para extraer la parte cuando la persona está corriendo
transitionTime = datetime('2019-07-14 18:51:32');
runningData = dataResampled(dataResampled.Timestamp > transitionTime, :);

% Obtener el canal Y de los datos de correr y aplicar detrend


yRunning = detrend(runningData.Y);

% Calcular la frecuencia fundamental usando FFT


Fs = 50; % Frecuencia de muestreo
L = length(yRunning); % Longitud de la señal
Y = fft(yRunning);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
f = Fs*(0:(L/2))/L;

% Encontrar la frecuencia dominante (frecuencia fundamental)


[~, idx] = max(P1);
fundamentalFrequency = f(idx);

fprintf('La frecuencia fundamental es %.2f Hz\n', fundamentalFrequency);

1
La frecuencia fundamental es 1.32 Hz

Ahora para el segundo es totalmente analago

PREGUNTA 2

% Limpiar
clear

% Cargar los archivos de audio


[audmal, fmal] = audioread('MaleSpeech-16-4-mono-20secs.wav');
[audfem, ffem] = audioread('FemaleSpeech-16-4-mono-20secs.wav');
%obtenemos información sobre el archivo de audio
informacion_fem = audioinfo('FemaleSpeech-16-4-mono-20secs.wav')

informacion_fem = struct with fields:


Filename: 'C:\Users\usuario\OneDrive - UNIVERSIDAD NACIONAL DE INGENIERIA\GoogleDrive\UNI\6 ciclo\Proce
CompressionMethod: 'Uncompressed'
NumChannels: 1
SampleRate: 4000
TotalSamples: 80000
Duration: 20
Title: []
Comment: []
Artist: []
BitsPerSample: 16

informacion_male = audioinfo('MaleSpeech-16-4-mono-20secs.wav')

informacion_male = struct with fields:


Filename: 'C:\Users\usuario\OneDrive - UNIVERSIDAD NACIONAL DE INGENIERIA\GoogleDrive\UNI\6 ciclo\Proce
CompressionMethod: 'Uncompressed'
NumChannels: 1
SampleRate: 4000
TotalSamples: 80000
Duration: 20
Title: []
Comment: []
Artist: []
BitsPerSample: 16

2
Estadísticas de los audios

median(audmal)

ans = 9.1553e-05

kurtosis(audmal)

ans = 10.4153

skewness(audmal)

ans = 0.4267

median(audfem)

ans = 7.9346e-04

kurtosis(audfem)

ans = 20.4910

skewness(audfem)

ans = -0.3120

Creamos tablas de tiempo para los datos de audio

maletable = timetable(audmal, 'SampleRate', fmal, 'VariableNames', "Data");


femaletable = timetable(audfem, 'SampleRate', ffem, 'VariableNames', "Data");

% Calcular el periodograma para el audio masculino y femenino


[powmale, frmale] = periodogram(maletable.Data, [], [], fmal);
[powfemale, frfemale] = periodogram(femaletable.Data, [], [], ffem);

% Obtener las frecuencias de muestreo de las tablas de tiempo


srmal = maletable.Properties.SampleRate;
srfem = femaletable.Properties.SampleRate;

Usando una longitud de ventana de 100 ms

windowLength = 0.1;

Ventana para el análisis espectral del audio masculino y femenino

window = rectwin(windowLength * srmal);

3
spectralSpread(powmale, srmal, "Window", window) % Calcular la dispersión
espectral del audio masculino

spectralSkewness(powmale, srmal, "Window", window) % Calcular la skewness


espectral del audio masculino

4
spectralKurtosis(powmale, srmal, "Window", window) % Calcular la kurtosis
espectral del audio masculino

5
window = rectwin(windowLength * srfem);
spectralSpread(powfemale, srfem, "Window", window) % Calcular la dispersión
espectral del audio femenino

spectralSkewness(powfemale, srfem, "Window", window) % Calcular la skewness


espectral del audio femenino

6
spectralKurtosis(powfemale, srfem, "Window", window) % Calcular la kurtosis
espectral del audio femenino

7
% Calcular las longitudes de ventana
winLength_female = round(0.1*ffem);
winLength_male = round(0.1*fmal);

% Frecuencia fundamental para el audio femenino


F0_female = pitch(audfem, ffem, 'WindowLength', winLength_female);

% Frecuencia fundamental para el audio masculino


F0_male = pitch(audmal, ffem, 'WindowLength', winLength_male);

% Calcular las frecuencias fundamentales promedio


mean_F0_female = mean(F0_female);
mean_F0_male = mean(F0_male);

% Crear la tabla con los resultados


senales = {'Audio femenino', 'Audio masculino'};
F0_promedio = [mean_F0_female; mean_F0_male];
tabla_resultados = table(senales', F0_promedio, 'VariableNames', {'Señales', 'F0'});

% Mostrar la tabla
disp('Tabla de resultados:');

Tabla de resultados:

disp(tabla_resultados);

Señales F0
___________________ ______

{'Audio femenino' } 164.62


{'Audio masculino'} 111.68

PREGUNTA 3

8
MI CODIGO 20192749J TERMINA EN IMPAR

%%Primero es importar el Audio


%Problema N°3-PC4

[s, Fs] = audioread('AudioConteo.wav');

% Crear una tabla de tiempo con la señal de audio cargada.


conteo = timetable(s, 'SampleRate', Fs, 'VariableNames', "Data");

% Extraer el canal de audio.


L = s(:, 1);

% Calcular el tiempo total en segundos.


time = size(s, 1) / Fs;
x = 0:1/Fs:time;
t = x(2:end)';

% Graficar la forma de onda del sonido.


figure(2)
plot(t, L, '-b')
title('Sonido_{Graf}')

9
% Identificar la sección del audio que contiene el conteo del 6 al 10.
conteo6a10 = conteo(conteo.Time > seconds(8.5), :);

% Reproducir y verificar los números del 6 al 10.


sound(conteo6a10.Data, Fs)

% Separar y guardar segmentos individuales para cada número.


seis = conteo(conteo.Time > seconds(8.5) & conteo.Time < seconds(10), :);
siete = conteo(conteo.Time > seconds(10) & conteo.Time < seconds(12), :);
ocho = conteo(conteo.Time > seconds(12) & conteo.Time < seconds(13), :);
nueve = conteo(conteo.Time > seconds(13) & conteo.Time < seconds(15), :);
diez = conteo(conteo.Time > seconds(15), :);

% Reproducir y guardar los números en variables individuales.


sound(seis.Data, Fs)
sound(siete.Data, Fs)
sound(ocho.Data, Fs)
sound(nueve.Data, Fs)

% Almacenar los datos en variables separadas para análisis espectral.


cont6 = seis.Data;
cont7 = siete.Data;
cont8 = ocho.Data;
cont9 = nueve.Data;
cont10 = diez.Data;

10
% Calcular el espectro de potencia para cada número.
[c6s, c6f] = periodogram(cont6, [], [], Fs);
[c7s, c7f] = periodogram(cont7, [], [], Fs);
[c8s, c8f] = periodogram(cont8, [], [], Fs);
[c9s, c9f] = periodogram(cont9, [], [], Fs);
[c10s, c10f] = periodogram(cont10, [], [], Fs);

Calculamos y mostramos diversas características espectrales para cada número.

% Para el conteo "seis":


spectralCentroid(c6s, Fs)

spectralSpread(c6s, Fs)

11
spectralSkewness(c6s, Fs)

12
spectralKurtosis(c6s, Fs)

spectralEntropy(c6s, Fs)

13
spectralFlatness(c6s, Fs)

14
spectralCrest(c6s, Fs)

spectralFlux(c6s, Fs)

15
spectralSlope(c6s, Fs)

16
spectralDecrease(c6s, Fs)

% Para el conteo "siete":


spectralCentroid(c7s, Fs)

17
spectralSpread(c7s, Fs)

18
spectralSkewness(c7s, Fs)

spectralKurtosis(c7s, Fs)

19
spectralEntropy(c7s, Fs)

20
spectralFlatness(c7s, Fs)

spectralCrest(c7s, Fs)

21
spectralFlux(c7s, Fs)

22
spectralSlope(c7s, Fs)

spectralDecrease(c7s, Fs)

23
% Para el conteo "ocho":
spectralCentroid(c8s, Fs)

24
spectralSpread(c8s, Fs)

25
spectralSkewness(c8s, Fs)

spectralKurtosis(c8s, Fs)

26
spectralEntropy(c8s, Fs)

27
spectralFlatness(c8s, Fs)

spectralCrest(c8s, Fs)

28
spectralFlux(c8s, Fs)

29
spectralSlope(c8s, Fs)

spectralDecrease(c8s, Fs)

30
% Para el conteo "nueve":
spectralCentroid(c9s, Fs)

31
spectralSpread(c9s, Fs)

32
spectralSkewness(c9s, Fs)

spectralKurtosis(c9s, Fs)

33
spectralEntropy(c9s, Fs)

34
spectralFlatness(c9s, Fs)

spectralCrest(c9s, Fs)

35
spectralFlux(c9s, Fs)

36
spectralSlope(c9s, Fs)

spectralDecrease(c9s, Fs)

37
% Para el conteo "diez":
spectralCentroid(c10s, Fs)

38
spectralSpread(c10s, Fs)

39
spectralSkewness(c10s, Fs)

spectralKurtosis(c10s, Fs)

40
spectralEntropy(c10s, Fs)

41
spectralFlatness(c10s, Fs)

spectralCrest(c10s, Fs)

42
spectralFlux(c10s, Fs)

43
spectralSlope(c10s, Fs)

spectralDecrease(c10s, Fs)

44
PREGUNTA 4

clearvars;
clc;

% Los archivos
file_names = {'ecg_raw5.mat', 'ecg_raw6.mat', 'ecg_raw7.mat', 'ecg_raw8.mat'};

45
window_size = 4; % Tamaño de la ventana para el filtro de promedio móvil
cutoff_freq = 100; % Frecuencia de corte del filtro pasa bajo
Fs = 500; % Frecuencia de muestreo

iteramos para cada archivo

for i = 1:length(file_names)
% Cargar el archivo ecg
file_name = file_names{i};
load(file_name);

% Crear un vector de minutos para el eje x


mins = 1:length(x);

% Graficar la señal ECG original


figure;
plot(mins, x)
title(['Señal ECG Original - ', file_name])
xlabel('Tiempo (minutos)')
ylabel('Amplitud')

% Aplicar suavizado a la señal ECG


x_smooth = smoothdata(x);

% Graficar la señal suavizada en color rojo


figure;
plot(mins, x_smooth, 'r')
title(['Señal ECG Suavizada - ', file_name])
xlabel('Tiempo (minutos)')
ylabel('Amplitud')

% Aplicar el filtro de promedio móvil a la señal suavizada


x_filtered = movmean(x_smooth, window_size);

% Graficar la señal original, suavizada y filtrada


figure;
plot(mins, x, mins, x_smooth, mins, x_filtered)
title(['Señales ECG: Original, Suavizada y Filtrada - ', file_name])
legend('Original', 'Suavizada', 'Filtrada')
xlabel('Tiempo (minutos)')
ylabel('Amplitud')

% Aplicar un filtro pasa bajo a la señal filtrada


lowpass_filtered = lowpass(x_filtered, cutoff_freq, Fs);

% Graficar la señal filtrada con el filtro pasa bajo


figure;
plot(mins, lowpass_filtered)
title(['Señal ECG Filtrada con Pasa Bajo - ', file_name])

46
xlabel('Tiempo (minutos)')
ylabel('Amplitud')
end

47
48
49
50
51
52
53
54

También podría gustarte