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