saeshma_mono_OAS_OSM.zip

  • Aeshma
    了解作者
  • matlab
    开发工具
  • 3.9MB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 1
    下载次数
  • 2021-02-08 02:58
    上传日期
Implementations of noth overlapp and save and overlap and add using convolution with 2 channels
saeshma_mono_OAS_OSM.zip
  • Immigrant Song.mp3
    4MB
  • mono_OAS_OSM.m
    3.8KB
内容介绍
close all; clear all; clc; [audio1, Fs] = audioread('Immigrant Song.mp3'); % Coleta dados da Música audio = audio1(:,1) + audio1(:,2); % caso queira fazer mono: %% Filter % Aqui contém o filtro h, nete caso eu criei um qualquer para teste. % Substitua pelo que vc for usar low_pass = designfilt('lowpassfir', 'FilterOrder', 1000, 'CutoffFrequency', 500, 'SampleRate', 44100); h = low_pass.Coefficients'; %% Linear Convolution lc1 = conv(audio, h); %aqui é a convolução linear %% L = 10000; N1 = length(audio); M = length(h); % Aqui é a mesma coisa, só que usando fft h = [h; zeros(L-1, 1)]; % adiciono L-1 zeros ao final do vetor h H = fft(h, L+M-1); % (L+M-1) - janela da fft %% Overlap and Add (OAM - Overlap-add Method) x = [audio; zeros(mod(-N1,L), 1)]; %aqui é um zero padding utilizando a funcão mod para determinar o tamanho do vetor de zeros % help mod para entender como % funciona N2 = length(x); % tamanho de x S = N2/L; % quantos segmentos o arquivo vai ser dividido e quantas vezes o for vai rodar idx = 1:L; % essa variável é apenas facilitar a seleção de uma quantidade L dentro de um vetor X_OAM = zeros(M-1,1); % aqui eu zero o vetor, ou seja, transformo em um vetor de zeros com M-1 elementos % mudei o nome da variável acima, para facilitar o % entendimento x_OAM é diferente de X_OAM, um é o audio % com zero padding, e o outro e um vetor de zeros. for stage = 1:S % Selecting sequence to process xm = [x(idx); zeros(M-1, 1)]; % vetor com L elementos de x seguido de um vetor de zeros com M-1 linhas e 1 coluna, x é um vetor com 1 coluna X1 = fft(xm, L+M-1); Y = X1 .* H; % multiplicação no dominio da frequencia = convolução no domínio do tempo Y = ifft(Y); % transformada inversa % Samples Added in every stage Z = X_OAM((length(X_OAM)-M+2):length(X_OAM)) + Y(1:M-1); % Channel 1 X_OAM = [X_OAM(1:(stage-1)*L); Z; Y(M:M+L-1)]; idx = stage*L+1:(stage+1)*L; end ii = 1 : N1+M-1; X_OAM = X_OAM(ii); similarity_OAM = corrcoef(X_OAM, lc1) %% Overlap and Save x = [audio; zeros(mod(-N1,L), 1); zeros(L, 1)]; N2 = length(x); S = N2/L; idx0 = 1:L; xm = x(idx0); % For first stage Special Case x1 = [zeros(M-1, 1); xm]; % zeros appeded at Start point X_OSM = []; %aqui é um vetor vazio, nulo, pq para esse método for stage=1:S X1 = fft(x1, L+M-1); Y = X1 .* H; Y = ifft(Y); Y = Y(M:M+L-1); %Discarding Samples X_OSM = [X_OSM; Y]; idx1 = ((stage*L)-M+2):((stage+1)*L); % Selecting Sequence to process if idx1(L+M-1) <= N2 x1 = x(idx1); end end jj = 1:N1+M-1; X_OSM = X_OSM(jj); similarity_OSM = corrcoef(X_OSM,lc1) %% Play Music player0 = audioplayer(audio, Fs); % Objeto para tocar o áudio % play(player0) % Play % stop(player0) % Stop player1 = audioplayer(X_OAM, Fs); % play(player1) % stop(player1) player2 = audioplayer(X_OSM, Fs); % play(player2) % stop(player2) %% Plots figure() subplot(4,1,1); plot(lc1); title('Convolution Using conv() function') xlabel('n'); ylabel('y(n)'); subplot(4,1,2); plot(X_OAM); title('Convolution Using Overlap Add Method') xlabel('n'); ylabel('y(n)'); subplot(4,1,3); plot(X_OSM); title('Convolution Using Overlap Save Method') xlabel('n'); ylabel('y(n)'); subplot(4,1,4); plot(audio); title('Audio') xlabel('n'); ylabel('y(n)');
评论
    相关推荐