-
Notifications
You must be signed in to change notification settings - Fork 0
/
DSP_Karplus_Strong.asv
122 lines (85 loc) · 2.4 KB
/
DSP_Karplus_Strong.asv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
%Primer entregable DSP
%Algoritmo karplus/strong
clc;clear; close all;
%fs frecuencia de muestreo
%FO frecuencia (Centra)
%110hz equivale a un LA
FO=220; %clave de LA
%llamado de funcion loop
loop(FO)
function loop(FO)
%Tabla Presentada en pdf 'Primera práctica de laboratorio de DSP'
%'Conceptos Básicos de Señales y Procesamiento de Señales '
Notas_n = {'0LA','0LA#','0SI','0DO','0DO#','0RE',...
'0RE#','0MI','0FA','0FA#','0SOL','0SOL#'...,
'LA','LA#','SI','DO','DO#','RE',...
'RE#','MI','FA','FA#','SOL','SOL#'...
,'1LA','1LA#','1SI','1DO','1DO#','1RE',...
'1RE#','1MI','1FA','1FA#','1SOL','1SOL#', 'SILENCIO'};
Equivalente_n = [-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 ...
-2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
17 18 19 20 21 22 23 85];
Pentagrama = containers.Map(Notas_n,Equivalente_n);
% -------------- --------------- ----------------
%Para la creacion de la cancion es necesario variar
% 3 Datos
% -1 el arreglo de 'notas'
% -2 el string fs (que define la duracion)
% -3 el string Tono_nota (que define el timbre)
%Eqivalencias -redonda 44800
% -blanca 22400
% -negra 5600
notas={'DO','DO','LA'...
'SILENCIO','SI','SOL',...
'DO','DO'...
'LA','SI','SOL','DO'...
'DO','LA','SI','SOL'...
'FA','RE'};
fs=44100;
tono_nota=[0, 0,...
0, 0,0,...
0, 0,0, 0,...
0, 0,0,...
0, 0, 0];
%Pausa
pause on
%D Duracion de la nota
D= 1.5;
for i=1:length(notas)
%cell2mat utilizado para obtener el valor de notas
%De esa forma se da la nota y no su equivalente (numero)
nota_entero=cell2mat((values(Pentagrama,notas(i))));
%llamado a la funcion nota
nota(D,fs,FO,nota_entero)
end
end
function nota(D,fs,FO,nota_entero)
%Se crea la nota dependiendo de el parametro nota_entero
Fo=FO*(2^(nota_entero/12));
%Calcular el periodo de la señal
T =floor(fs/Fo);
%Tañir la cuerda
x=(pi/2)*rand(T,1)-1; %corresponde a un nivel dc de cero
%Numero de muestras
N=D*fs;
%Crear el sonido
Y=zeros(N,1); %muestras en cero
Y(1:T)=x;% la primer muestra igual a la entrada
tono(Y,N,T,fs)
end
function tono(Y,N,T,fs)
for i=1:N-T
%filtro
Y(i+T)=(Y(i)+Y(i+1))/2.01;
end
%Creacion del sonido.
sound(Y,fs);
pause(0.4);
%Otro metodo de creacion del sonido
%soundsc(Y,fs);
t=(0:length(Y)-1)/fs;
plot(t,Y)
%plot(Y)
%x=length(Y)
%z=length(t)
end