I am new to matlab and I'm trying to filter the noise out of the audio. I tried some filters but can't event get close to lessening the noise.

8 次查看(过去 30 天)
[originalAudio, Fs] = audioread('original.wav');
[noisyAudio, ~] = audioread('noisy.wav');
t = (0:length(originalAudio)-1)/Fs;
figure;
subplot(2,1,1);
plot(t, originalAudio);
xlabel('Time (s)');
ylabel('Amplitude');
title('Original Audio');
subplot(2,1,2);
plot(t, noisyAudio);
xlabel('Time (s)');
ylabel('Amplitude');
title('Noisy Audio');
N = length(originalAudio);
f = Fs*(0:(N/2))/N;
originalSpec = fft(originalAudio);
noisySpec = fft(noisyAudio);
figure;
subplot(2,1,1);
plot(f, abs(originalSpec(1:N/2+1)));
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('Original Audio Spectrum');
subplot(2,1,2);
plot(f, abs(noisySpec(1:N/2+1)));
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('Noisy Audio Spectrum');
fc1 = 2000;
fc2 = 500;
[b1, a1] = butter(6, fc1/(Fs/2), 'low');
[b2, a2] = butter(6, fc2/(Fs/2), 'low');
filteredAudio1 = filter(b1, a1, noisyAudio);
filteredAudio2 = filter(b2, a2, filteredAudio1);
figure;
plot(t, filteredAudio2);
xlabel('Time (s)');
ylabel('Amplitude');
title('Filtered Audio');
filteredSpec2 = fft(filteredAudio2);
figure;
plot(f, abs(filteredSpec2(1:N/2+1)));
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('Filtered Audio Spectrum');
figure;
subplot(2,1,1);
plot(t, originalAudio);
xlabel('Time (s)');
ylabel('Amplitude');
title('Original Audio');
subplot(2,1,2);
plot(t, filteredAudio2);
xlabel('Time (s)');
ylabel('Amplitude');
title('Filtered Audio (Closest to Original)');
sound(filteredAudio2, Fs);
I have the noisy file and the original file that is attached: I need to make the noisy file as close to the original as possible.
  5 个评论

请先登录,再进行评论。

采纳的回答

Star Strider
Star Strider 2024-4-28
编辑:Star Strider 2024-4-28
If it contains broadband noise, a frequency-selective filter will not be able to eliminate the noise. In that event, experiment with either wavelet denoising or use the sgolayfilt function. The Savitzky-Golay filter is usually effective at eliminating broadband noise, although it requires experimentation. I usually use a 3-degree polynomial and then change the ‘framelen’ value until I get the result I want.
EDIT — (28 Apr 2024 at 15:15)
The ‘noisy’ file definitely has broadband noise, however it may not be possible to filter it back to the original file.
Uz = unzip('Wavfiles.zip')
Uz = 1x3 cell array
{'Wavfiles/'} {'Wavfiles/noisy.wav'} {'Wavfiles/original.wav'}
figure
tiledlayout(4,1)
for k = 1:2
fn = Uz{k+1}
[y{k},Fs(k)] = audioread(fn);
ysize = size(y{k},1);
t{k} = linspace(0, ysize-1, ysize).'/Fs(k);
nexttile
plot(t{k}, y{k})
grid
xlabel('Time')
ylabel('Amplitude')
title(fn)
[FTs1{k},Fv{k}] = FFT1(y{k},t{k});
nexttile
plot(Fv{k}, abs(FTs1{k}))
grid
xlabel('Frequency')
ylabel('Magnitude')
title(fn)
end
fn = 'Wavfiles/noisy.wav'
fn = 'Wavfiles/original.wav'
y1_filt = sgolayfilt(y{1}, 3, 201);
figure
tiledlayout(2,1)
nexttile
plot(t{1}, y{1})
grid
xlabel('Time')
ylabel('Amplitude')
title('Unfiltered')
nexttile
plot(t{2}, y1_filt)
grid
xlabel('Time')
ylabel('Amplitude')
title('Filtered')
function [FTs1,Fv] = FFT1(s,t)
t = t(:);
L = numel(t);
if size(s,2) == L
s = s.';
end
Fs = 1/mean(diff(t));
Fn = Fs/2;
NFFT = 2^nextpow2(L);
FTs = fft((s - mean(s)) .* hann(L).*ones(1,size(s,2)), NFFT)/sum(hann(L));
Fv = Fs*(0:(NFFT/2))/NFFT;
% Fv = linspace(0, 1, NFFT/2+1)*Fn;
Iv = 1:numel(Fv);
FTs1 = FTs(Iv,:);
end
I will consider other possibilities, however this is likely the best I can do with this file. The noise completely swamps the signal.
.
  11 个评论
Sam Chak
Sam Chak 2024-4-28
In practice, what reliable options do we have to attenuate the effect of broadband noise before it corrupts the original audio during measurement? Restoring the original audio from the noise-corrupted audio seems like a challenging task, although I acknowledge that noise-corrupted audio is still audible to humans to a certain extent.
If we train an AI Voice Classifier using the original audio, do you think it would be capable of improving the intelligibility of the audio by reconstructing certain parts of the signal?
Star Strider
Star Strider 2024-4-28
@Godwin Emmanuel — Thank you!
@Sam Chak — That could work. I don’t have sufficient experience with A.I. audio processing to attempt it. I am not certain how to approach this problem from that perspective, however I would definitely like to find out how to do it.

请先登录,再进行评论。

更多回答(2 个)

Image Analyst
Image Analyst 2024-4-28
Did you try the Data Cleaner app on the Apps tab of the tool ribbon?
Can you upload a screenshot of your noisy original data, and of the denoised signal that you say is not denoised enough?
If you have any more questions, then attach your screenshots and code with the paperclip icon after you read this:

Ivan
Ivan 2024-4-28
are there other methods that can be used?

类别

Help CenterFile Exchange 中查找有关 Audio I/O and Waveform Generation 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by