Síntese de acorde + harmônicas...
Melhoria de Sintese #1 de Acorde, desta vez acrescentando harmônicas com decaimento logarítmico:
Código:
% Programa para sintetizar um acorde do tipo aberto, maior, formado pela combinação% das notas: Dó (oitava superior) + Mi (oitava inferior) + Sol (oitava superior):%% Mi = 164,81 Hz (~~E3~~ <-- E2); --> ou: E3 = 329.627533 Hz;% Dó = 261,63 Hz (~~C4~~ <-- C3); --> ou: C4 = 523.251099 Hz;% Sol= 392,00 Hz (~~G4~~ <-- C3). --> ou: G4 = 783.990845 Hz.%% Obs: amplitudes unitárias e defasagens nulas%% Versão #2:% % Acrescenta harmônicas com decaimento logarítmico: % -20 db/década, ou 6 dB/oitava (10^(-6/20) = 0.50119/oitava)% a partir da freq. superior à maior freq, das notas originais
% Fernando Passold, em 18/05/2026
clear allclc % limpa janela de comandos
t_fim=7; % tempo de execução em segundos% f=[164.81 261.63 392.00]; % freq's das notas: E3, C4 e G4disp('Frequências originais das notas:')f=[659.26 261.63 392.00] % freq's das notas: E4, C4 e G4G=[1 1 1]; % amplitudes de cada notaqtdade_freqs_originais = length(f);
% Gerando harmônicas extras:% Amplitudes das harmônicas cai de forma logarítmica, % -20 db/década, ou 6 dB/oitava (10^(-6/20) = 0.50119/oitava)% mas a partir da freq. superior à maior freq, das notas originaisfim = length(f);har = 3; % quantidade de harmônicas extrascont = fim;for h = 1:har for componente = 1:fim cont = cont + 1; f(cont) = f(cont-fim)*2; G(cont) = G(cont-fim)*0.5; endenddisp('Total frequências sintetizadas:')contdisp('Frequências x Ganhos')[f' G']
% Gráfico do espectro do sinalfigure;% plotanto linhas guias dos espectros originaisstem( f(1:qtdade_freqs_originais), G(1:qtdade_freqs_originais)*1.2, ':', 'Color', [1, 0.5, 0], 'LineWidth', 2);hold on% sobrepondo todas linhas do espectrostem(f, G, 'b-', 'LineWidth', 3, 'MarkerSize', 8) % mas escala freq é linearset(gca, 'XScale', 'log'); % Transforma o eixo X em logarítmicogrid ontitle("Espectro do Acorde")xlabel("log_{10}(Frequência) (Hz)");ylabel("Ganho (abs)")
% monta string da legenda% >> legenda=["1"; "22"; "333"]% legenda = % 3×1 string array% "1"% "22"% "333"% >>size(legenda)% ans =% 3 1% >> legenda(2)% ans = % "22"for freq = 1:length(f) msg1 = num2str( freq ); % transforma valor em string msg2 = num2str( f(freq) ); % transforma valor em string msg3 = ['f(', msg1, ') = ', msg2, ' Hz']; % 'f(1) = 659.26 Hz' legenda(freq) = string(msg3); % transforma cada pedaço numa stringendlegenda(freq+1)="Composição Final";% legenda % apenas para verificação
fs=48E3; % freq. de amostragemT=1/fs;disp('Quantidade de pontos (amostras) geradas:')pontos=t_fim/T % quantidade de pontos que serão geradosy=zeros(pontos, length(f)+1); % gera um vetor de 240.000 pontos% t=[0:T:t_fim]; % gera matriz 1 x 240001t=[0:T:t_fim-T];t=t'; % matriz de 240000 x 1
% y1=1*sin(2*pi*f*t+defasagem);% y[]=1*sin(2*pi*f(1, k)*t);% y=y1+y2+y3;for tt = 1:length(t) for freq = 1:length(f) % y(tt, 1) = y(tt, 1) + 1*sin(2*pi*f(1, freq)); y(tt, freq) = G(freq)*sin(2*pi*f(1, freq)*t(tt,1) ); % amplitude para cada nota no instante t y(tt, length(f)+1) = y(tt, length(f)+1) + y(tt, freq); % somar amplitudes das nota em cada instante t endend
% Plotando as formas de ondamenor_freq=min(f);intervalo_tempo=6*(1/menor_freq); % motrando 6 ciclos da menor freqamostras=round(intervalo_tempo/T);figure;plot( t(1:amostras,1), y(1:amostras, 1));hold onfor freq = 2:length(f)+1 if freq < length(f)+1 plot( t(1:amostras, 1), y(1:amostras, freq)); else plot( t(1:amostras, 1), y(1:amostras, freq), 'LineWidth', 3); endendlegend(legenda);title("Síntese do Acorde")xlim([0 intervalo_tempo]);
% Normalizando ampitude do sinal para faixa [-1 1]disp('Picos de amplitudes sinal composto:')maximo=max(y(:, length(f)+1)) %*1.1 % 10% a maisminimo=min(y(:, length(f)+1)) % *1.1if maximo > abs(minimo) maximo = maximo;else maximo = abs(minimo);endyy=y(:, length(f)+1)*(1/maximo);
% Aplicando decaimento % ganho(t) = exp(=t/tau)% ts = 4*tau% ts = t_fimdisp('Constante de decaimento:')tau = t_fim/5for tt = 1:length(t) y1(tt) = exp(-t(tt,1)/tau); y2(tt) = -y1(tt); yy(tt) = yy(tt)*exp(-t(tt,1)/tau);endfigure; % nova figuraplot(t,y1,'k--', t,y2,'k--', t,yy,'b-')title("Sinal com Decaimento");ylim([-1 1]);
sound(yy, fs)disp('Se quiser ouvir novamente, digite:')disp(' sound(yy,fs)')
Resultados:

Clique abaixo
se quiser ouvir o resultado.
Seguir para: Síntese #1 (SEM harmônicas) | Proposta Trabalho 2026/1 .
Fernando Passold, em 18/05/2026.