Удалить шум из wav файла, MATLAB

Я использовал MATLAB только как калькулятор, поэтому я не так хорошо разбираюсь в программе. Надеюсь, что добрый человек сможет мне помочь, поскольку Google в настоящее время не мой друг.

У меня есть wav файл в ссылке ниже, где есть человеческий голос и некоторый шум в фоновом режиме. Я хочу, чтобы шум был удален. Есть ли кто-нибудь, кто может сказать мне, как это сделать в MATLAB?

https://www.dropbox.com/s/3vtd5ehjt2zfuj7/Hold.wav

Ответ 1

Это довольно несовершенное решение, тем более что некоторые шумы встроены в тот же частотный диапазон, что и голос, который вы слышите в файле, но здесь ничего не происходит. То, о чем я говорил в отношении частотного спектра, заключается в том, что если вы слышите звук, фоновый шум имеет очень низкий гул. Это находится в низкочастотном диапазоне спектра, тогда как голос имеет более высокую частоту. Таким образом, мы можем применить полосовой фильтр, чтобы избавиться от низкого уровня шума, захватить большую часть голоса, и любые шумные частоты на более высокой стороне также будут отменены.

Вот шаги, которые я сделал:

  1. Прочитайте в аудиофайле с помощью audioread.
  2. Воспроизведите исходный звук, чтобы я мог слышать, как это звучит. Сделайте это, создав объект audioplayer.
  3. Запланируйте как левый, так и правый каналы, чтобы посмотреть звуковой сигнал во временной области... если он дает какие-либо подсказки. Глядя на каналы, оба они кажутся одинаковыми, поэтому похоже, что для обоих каналов был отображен только один микрофон.
  4. Я принял преобразование Фурье и увидел распределение частоты.
  5. Используя (4), я выяснил грубое приближение, где я должен отрезать частоты.
  6. Разработан полосовой фильтр, который отсекает эти частоты.
  7. Отфильтрованный сигнал затем воспроизвел его, построив еще один объект audioplayer.

Отпусти!


Шаг 1

%% Read in the file
clearvars;
close all;
[f,fs] = audioread('Hold.wav');

audioread будет читать в аудиофайле для вас. Просто укажите, какой файл вы хотите в пределах ''. Кроме того, убедитесь, что вы установили, что ваш рабочий каталог находится там, где хранится этот файл. clearvars, close all просто очистить для нас. Он закрывает все наши окна (если они открыты) и очищает все наши переменные в рабочей области MATLAB. f будет сигналом, считываемым в MATLAB, тогда как fs - частота дискретизации вашего сигнала. f здесь - двумерная матрица. Первый столбец - левый канал, а второй - правый. В общем, общее количество каналов в вашем звуковом файле обозначается общим числом столбцов в этой матрице, считываемым через audioread.

Шаг 2

%% Play original file
pOrig = audioplayer(f,fs);
pOrig.play;

Этот шаг позволит вам создать объект audioplayer который принимает сигнал, который вы читаете в (f), с частотой дискретизации fs и выводит объект, хранящийся в pOrig. Затем вы используете pOrig.play для воспроизведения файла в MATLAB, чтобы вы могли его услышать.

Шаг 3

%% Plot both audio channels
N = size(f,1); % Determine total number of samples in audio file
figure;
subplot(2,1,1);
stem(1:N, f(:,1));
title('Left Channel');
subplot(2,1,2);
stem(1:N, f(:,2));
title('Right Channel');

stem - способ построения дискретных точек в MATLAB. Каждый момент времени имеет круг, нарисованный в точке с вертикальной линией, оттянутой от горизонтальной оси до этого момента времени. subplot - способ разместить несколько фигур в одном окне. Я не буду вдаваться в него здесь, но вы можете прочитать о том, как subplot работает подробно, ссылаясь на fooobar.com/info/494635/.... В приведенном выше коде показан график, показанный ниже:

signals

Вышеприведенный код довольно прямолинейный. Я просто планирую каждый канал по отдельности в каждом подзаголовке.

Шаг №4

%% Plot the spectrum
df = fs / N;
w = (-(N/2):(N/2)-1)*df;
y = fft(f(:,1), N) / N; % For normalizing, but not needed for our analysis
y2 = fftshift(y);
figure;
plot(w,abs(y2));

Код, который будет выглядеть наиболее пугающим, - это код выше. Если вы помните из сигналов и систем, максимальная частота, которая представлена в нашем сигнале, - это частота дискретизации, деленная на 2. Это называется частотой Найквиста. Частота дискретизации вашего аудиофайла составляет 48000 Гц, что означает, что максимальная частота, представленная в вашем аудиофайле, составляет 24000 Гц. fft означает быстрое преобразование Фурье. Подумайте об этом как о очень эффективном способе вычисления преобразования Фурье. Традиционная формула требует, чтобы вы выполняли несколько суммирования для каждого элемента вашего вывода. БПФ будет вычислять это эффективно, требуя гораздо меньших операций и все равно даст вам тот же результат.

Мы используем fft чтобы посмотреть на частотный спектр нашего сигнала. Вы вызываете fft, указывая fft входной сигнал в качестве первого параметра, а затем количество точек, которые вы хотите оценить со вторым параметром. Обычно вы указываете количество точек в вашем FFT как длину сигнала. Я делаю это, проверяя, сколько строк у нас есть в нашей звуковой матрице. Когда вы строите частотный спектр, я просто взял один канал, чтобы сделать вещи простыми, поскольку другой канал одинаковый. Это служит первым входом в fft. Кроме того, имейте в виду, что я разделен на N поскольку это правильный способ нормализации сигнала. Однако, поскольку мы просто хотим сделать снимок того, что выглядит в частотной области, вам действительно не нужно это делать. Однако, если вы планируете использовать его для вычисления чего-то позже, вам обязательно нужно это сделать.

Я написал некоторый дополнительный код, поскольку по умолчанию спектр не имеет значения. Я использовал fftshift так, чтобы центр отображался на 0 Гц, а левое - от 0 до -24000Hz, а правое - от 0 до 24000 Гц. Это интуитивно, как я вижу спектр частот. Вы можете думать о отрицательных частотах как о частотах, которые распространяются в противоположном направлении. В идеальном случае распределение частоты для отрицательной частоты должно быть равно положительной частоте. Когда вы строите частотный спектр, он сообщает вам, сколько вклада этой частоты приходится на выход. Это определяется величиной сигнала. Вы находите это, принимая функцию abs. Результат, который вы получаете, показан ниже.

enter image description here

Если вы посмотрите на сюжет, в низкочастотном диапазоне много пиков. Это соответствует вашему жужжанию, тогда как голос, вероятно, отображается в более высокий частотный диапазон, и его не так много, потому что голоса не слышно.

Шаг №5

По результатам проб и ошибок и взглянув на Шаг № 5, я понял, что все, начиная с 700 Гц и ниже, соответствует гудящему шуму, а более высокие уровни шума идут от 12000 Гц и выше.

Шаг №6

Вы можете использовать butter функцию из инструментальной панели обработки сигналов, чтобы помочь вам создать полосовой фильтр. Однако, если у вас нет этого инструментария, обратитесь к fooobar.com/info/2041382/... о том, как пользовательская функция выполняет одно и то же. Тем не менее, порядок для этого фильтра равен только 2. Предполагая, что у вас есть функция butter функции, вам нужно выяснить, в каком порядке вы хотите использовать свой фильтр. Чем выше порядок, тем больше будет работать. Я выбираю n = 7 для начала. Вам также необходимо нормализовать свои частоты, чтобы частота Найквиста составляла 1, а все остальное - между 0 и 1. После этого вы можете назвать butter так:

[b,a] = butter(n, [beginFreq, endFreq], 'bandpass');

bandpass флаг означает, что вы хотите создать полосовой фильтр, beginFreq и endFreq для нормализованной частоты начала и окончания, которую вы хотите использовать для полосового фильтра. В нашем случае это beginFreq = 700/Nyquist и endFreq = 12000/Nyquist. b,a - коэффициенты, используемые для фильтра, которые помогут вам выполнить эту задачу. Для этого вам понадобятся следующие шаги.

%% Design a bandpass filter that filters out between 700 to 12000 Hz
n = 7;
beginFreq = 700 / (fs/2);
endFreq = 12000 / (fs/2);
[b,a] = butter(n, [beginFreq, endFreq], 'bandpass');

Шаг № 7

%% Filter the signal
fOut = filter(b, a, f);

%% Construct audioplayer object and play
p = audioplayer(fOut, fs);
p.play;

Вы используете filter для фильтрации вашего сигнала, используя то, что вы получили на шаге №6. fOut будет вашим фильтрованным сигналом. Если вы хотите услышать его воспроизведение, вы можете построить и audioplayer на основе этого выходного сигнала с той же частотой дискретизации, что и вход. Затем вы используете p.play для прослушивания в MATLAB.

Дайте все это и посмотрите, как все это работает. Вероятно, вам больше всего придется играть в шагах №6 и №7. Это не идеальное решение, но достаточно, чтобы вы начали. Надеюсь.

Удачи!