TP3_8: Noise removal done.
@ -10,6 +10,7 @@ s = y(:,1);
|
|||||||
% F: vector of cyclical frequencies
|
% F: vector of cyclical frequencies
|
||||||
% T: vector of time instants
|
% T: vector of time instants
|
||||||
% P: power spectral density (PSD)
|
% P: power spectral density (PSD)
|
||||||
|
% signal, window, noverlap, nfft, fs
|
||||||
[S, F, T, P] = spectrogram(s, 128, 96, 128, Fs);
|
[S, F, T, P] = spectrogram(s, 128, 96, 128, Fs);
|
||||||
|
|
||||||
figure(1)
|
figure(1)
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
%% clean environment
|
|
||||||
clear; close all; clc
|
|
||||||
|
|
||||||
%% read input
|
|
||||||
[signal, fs] = audioread("Canto1.mp3");
|
|
||||||
|
|
||||||
%% Compute the FFT
|
|
||||||
signal_length = length(signal);
|
|
||||||
fhat = fft(signal, signal_length);
|
|
||||||
PSD = fhat.*conj(fhat)/signal_length; % Power spectrum density
|
|
||||||
%[S, freq, T, PSDlel] = spectrogram(signal, 128, 96, 128, Fs);
|
|
||||||
% signal, window, noverlap, nfft, fs
|
|
||||||
freq_vector = linspace(1, fs, signal_length);
|
|
||||||
L = 1:floor(signal_length/2);
|
|
||||||
|
|
||||||
cutoff_indices = abs(PSD)>0.002;
|
|
||||||
PSD_clean = PSD.*cutoff_indices;
|
|
||||||
fhat_filtered = cutoff_indices.*fhat;
|
|
||||||
signal_filtered = ifft(fhat_filtered);
|
|
||||||
|
|
||||||
figure(1)
|
|
||||||
plot(PSD)
|
|
||||||
|
|
||||||
figure(2)
|
|
||||||
plot(PSD_clean)
|
|
||||||
|
|
||||||
figure(3)
|
|
||||||
plot(signal)
|
|
||||||
|
|
||||||
figure(4)
|
|
||||||
plot(signal_filtered)
|
|
||||||
|
|
||||||
%% output
|
|
||||||
audiowrite('restored.flac', signal_filtered, fs);
|
|
58
TP3_8/DiogoEliseu_TP3_8_butterworth.m
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
%% Inicialização do ambiente
|
||||||
|
clear; close all; clc
|
||||||
|
|
||||||
|
%% >Exercício 8<
|
||||||
|
%% Input
|
||||||
|
[y, Fs] = audioread("Canto1.mp3"); % Signal and Sampling Frequency
|
||||||
|
signal = y(:,1); % Discard second channel
|
||||||
|
Fn = Fs/2; % Nyquist Frequency (Hz)
|
||||||
|
L = length(signal); % Signal Length
|
||||||
|
|
||||||
|
%% Find the noise
|
||||||
|
dft_signal = fft(signal)./L; % Fourier Transform
|
||||||
|
Fv = linspace(0, 1, fix(L/2)+1)*Fn; % Frequency Vector
|
||||||
|
|
||||||
|
%% Filter
|
||||||
|
%signal_filtered = filter(DiogoEliseu_TP3_8_butterworth_2nd_order_filter,signal);
|
||||||
|
signal_filtered = filter(DiogoEliseu_TP3_8_butterworth_filter,signal);
|
||||||
|
|
||||||
|
%% Filtered signal
|
||||||
|
dft_signal_filtered = fft(signal_filtered)/L; % Fourier Transform
|
||||||
|
|
||||||
|
%% Output
|
||||||
|
signal_power = abs(dft_signal(1:(L/2+1)));
|
||||||
|
figure(1)
|
||||||
|
subplot(2,3,1)
|
||||||
|
hold on
|
||||||
|
plot(Fv, signal_power)
|
||||||
|
grid
|
||||||
|
marks = [2850, 3020, 7000, 7150];
|
||||||
|
plot(2850, signal_power(2850), 'r*')
|
||||||
|
plot(3020, signal_power(3020), 'r*')
|
||||||
|
plot(7000, signal_power(7000), 'r*')
|
||||||
|
plot(7150, signal_power(7150), 'r*')
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("|H_{1}(f)|"); title("DFT do Sinal")
|
||||||
|
hold off
|
||||||
|
subplot(2,3,4)
|
||||||
|
plot(Fv, abs(dft_signal_filtered(1:(L/2+1))))
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("|H_{1}(f)|"); title("DFT do Sinal Filtrado")
|
||||||
|
subplot(2,3,2)
|
||||||
|
plot(Fv, signal(1:(L/2+1)))
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("Amplitude"); title("Sinal")
|
||||||
|
subplot(2,3,5)
|
||||||
|
plot(Fv, signal_filtered(1:(L/2+1)))
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("Amplitude"); title("Sinal Filtrado")
|
||||||
|
subplot(2,3,3)
|
||||||
|
plot(Fv, mag2db(signal_power))
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("Ganho (dB)"); title("Ganho do Sinal")
|
||||||
|
subplot(2,3,6)
|
||||||
|
plot(Fv, mag2db(abs(dft_signal_filtered(1:(L/2+1)))))
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("Ganho (dB)"); title("Ganho do Sinal Filtrado")
|
||||||
|
|
||||||
|
%sound(signal_filtered, Fs);
|
||||||
|
%audiowrite('canto1_butterworth.flac', signal_filtered, Fs);
|
21
TP3_8/DiogoEliseu_TP3_8_butterworth_2nd_order_filter.m
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
function Hd = DiogoEliseu_TP3_8_final2
|
||||||
|
%DIOGOELISEU_TP3_8_FINAL2 Returns a discrete-time filter object.
|
||||||
|
|
||||||
|
% MATLAB Code
|
||||||
|
% Generated by MATLAB(R) 9.8 and Signal Processing Toolbox 8.4.
|
||||||
|
% Generated on: 31-Dec-2020 16:39:59
|
||||||
|
|
||||||
|
% Butterworth Bandpass filter designed using FDESIGN.BANDPASS.
|
||||||
|
|
||||||
|
% All frequency values are in Hz.
|
||||||
|
Fs = 44100; % Sampling Frequency
|
||||||
|
|
||||||
|
N = 2; % Order
|
||||||
|
Fc1 = 2850; % First Cutoff Frequency
|
||||||
|
Fc2 = 7150; % Second Cutoff Frequency
|
||||||
|
|
||||||
|
% Construct an FDESIGN object and call its BUTTER method.
|
||||||
|
h = fdesign.bandpass('N,F3dB1,F3dB2', N, Fc1, Fc2, Fs);
|
||||||
|
Hd = design(h, 'butter');
|
||||||
|
|
||||||
|
% [EOF]
|
27
TP3_8/DiogoEliseu_TP3_8_butterworth_filter.m
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
function Hd = DiogoEliseu_TP3_8_final_filter
|
||||||
|
%DIOGOELISEU_TP3_8_FINAL_FILTER Returns a discrete-time filter object.
|
||||||
|
|
||||||
|
% MATLAB Code
|
||||||
|
% Generated by MATLAB(R) 9.8 and Signal Processing Toolbox 8.4.
|
||||||
|
% Generated on: 31-Dec-2020 19:24:38
|
||||||
|
|
||||||
|
% Butterworth Bandpass filter designed using FDESIGN.BANDPASS.
|
||||||
|
|
||||||
|
% All frequency values are in Hz.
|
||||||
|
Fs = 44100; % Sampling Frequency
|
||||||
|
|
||||||
|
Fstop1 = 2850; % First Stopband Frequency
|
||||||
|
Fpass1 = 3020; % First Passband Frequency
|
||||||
|
Fpass2 = 7000; % Second Passband Frequency
|
||||||
|
Fstop2 = 7150; % Second Stopband Frequency
|
||||||
|
Astop1 = 96; % First Stopband Attenuation (dB)
|
||||||
|
Apass = 1; % Passband Ripple (dB)
|
||||||
|
Astop2 = 104; % Second Stopband Attenuation (dB)
|
||||||
|
match = 'stopband'; % Band to match exactly
|
||||||
|
|
||||||
|
% Construct an FDESIGN object and call its BUTTER method.
|
||||||
|
h = fdesign.bandpass(Fstop1, Fpass1, Fpass2, Fstop2, Astop1, Apass, ...
|
||||||
|
Astop2, Fs);
|
||||||
|
Hd = design(h, 'butter', 'MatchExactly', match);
|
||||||
|
|
||||||
|
% [EOF]
|
55
TP3_8/DiogoEliseu_TP3_8_high_pass.m
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
%% Inicialização do ambiente
|
||||||
|
clear; close all; clc
|
||||||
|
|
||||||
|
%% >Exercício 8<
|
||||||
|
|
||||||
|
%% Input
|
||||||
|
[y, Fs] = audioread("Canto1.mp3"); % Signal and Sampling Frequency
|
||||||
|
signal = y(:,1); % Discard second channel
|
||||||
|
Fn = Fs/2; % Nyquist Frequency (Hz)
|
||||||
|
L = length(signal); % Signal Length
|
||||||
|
|
||||||
|
%% Compute the DFT
|
||||||
|
dft = fft(signal)./L;
|
||||||
|
magnitude = 10.*log10(abs(dft).^2); % power is squared, thus 10
|
||||||
|
Fv = linspace(0, 1, L)*Fn; % Frequency Vector
|
||||||
|
|
||||||
|
%% High-pass Filter
|
||||||
|
not_to_cutoff_indices = magnitude > -96;
|
||||||
|
dft_filtered = not_to_cutoff_indices.*dft;
|
||||||
|
magnitude_filtered = not_to_cutoff_indices.*magnitude;
|
||||||
|
signal_filtered = ifft(dft_filtered.*L);
|
||||||
|
|
||||||
|
%% Output
|
||||||
|
Fv_half = linspace(0, 1, fix(L/2)+1)*Fn;
|
||||||
|
y = abs(dft(1:(L/2+1)));
|
||||||
|
y_filtered = abs(dft_filtered(1:(L/2+1)));
|
||||||
|
figure(1)
|
||||||
|
subplot(2,3,1)
|
||||||
|
plot(Fv_half, y)
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("|H_{1}(f)|"); title("DFT do Sinal")
|
||||||
|
subplot(2,3,4)
|
||||||
|
plot(Fv_half, y_filtered)
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("|H_{1}(f)|"); title("DFT do Sinal Filtrado")
|
||||||
|
subplot(2,3,2)
|
||||||
|
plot(Fv_half, signal(1:(L/2+1)))
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("Amplitude"); title("Sinal")
|
||||||
|
subplot(2,3,5)
|
||||||
|
plot(Fv_half, y_filtered)
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("Amplitude"); title("Sinal Filtrado")
|
||||||
|
subplot(2,3,3)
|
||||||
|
%plot(Fv, magnitude);
|
||||||
|
plot(Fv_half, mag2db(y))
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("Ganho (dB)"); title("Ganho do Sinal")
|
||||||
|
subplot(2,3,6)
|
||||||
|
plot(Fv_half, mag2db(y_filtered))
|
||||||
|
grid
|
||||||
|
xlabel("Frequência (Hz)"); ylabel("Ganho (dB)"); title("Ganho do Sinal Filtrado")
|
||||||
|
|
||||||
|
%sound(signal_filtered, Fs);
|
||||||
|
%audiowrite('canto1_high_pass.flac', signal_filtered, Fs);
|
BIN
TP3_8/canto1_butterworh_2nd_order.flac
Normal file
BIN
TP3_8/canto1_butterworth.flac
Normal file
BIN
TP3_8/canto1_high_pass.flac
Normal file
BIN
TP3_8/img/filters/butterworth_filter.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
TP3_8/img/filters/butterworth_filter_2nd_order.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
TP3_8/img/plots/ft_signal.jpg
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
TP3_8/img/plots/ft_signal_zoom.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
TP3_8/img/plots/gain_butterworth_amplitude_points.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
TP3_8/img/plots/marked_ft_signal.jpg
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
TP3_8/img/plots/plot_ft_signal.jpg
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
TP3_8/img/plots/plot_ft_signal_filtered_2nd_order.jpg
Normal file
After Width: | Height: | Size: 75 KiB |