簡體   English   中英

從嘈雜的語音信號中過濾消息

[英]Filter message from noisy voice signal

我試圖破譯隱藏在一個非常嘈雜(聲音像是帶有額外低位無人機的白噪聲之類)的音頻文件(.wav)中的消息。 該消息是一個六位數的數字。 尚未通知我有關噪音的任何細節。 我嘗試使用低通濾波器,希望消除大多數較高的頻率將使我能夠聽到這些數字,但是,我似乎也無法擺脫足夠多的低架無人機,從而聽不到聲音。 我的嘗試如下(使用的函數'freq_space_low_pass_filter'包含在末尾):

[data, SampleRate, NbitsPerSample]=wavread('noisy_msg6.wav');

y=data(:,1); % we will work only with one channel in this demo 
N=length(y); %number of sample points
t=( (1:N)*1/SampleRate ).'; % time spacing is 1/SampleRate and we want column vector

Y=fft(y);

spectrum_freq=fourier_frequencies(SampleRate, N);

Freq3db=100;
[spectrum_filtered,g_vs_freq]=freq_space_low_pass_filter(Y, SampleRate, Freq3db);


y_filtered=ifft(spectrum_filtered);

y_filtered=real(y_filtered);



wavwrite(y_filtered/(0.1+max(y_filtered)), SampleRate, NbitsPerSample,        'noisy_msg6_filtered.wav');

%%%%%%%%down sampling%%%%%%%%

indexes=(abs(spectrum_freq) < 10*Freq3db);
spectrum_freq_down_sampled = spectrum_freq(indexes);
spectrum_down_sampled = spectrum_filtered(indexes);
N_down_sampled = length(spectrum_down_sampled);

spectrum_down_sampled=spectrum_down_sampled*N_down_sampled/N;

SampleRate_down_sampled=SampleRate*N_down_sampled/N;

y_down_sampled=real(ifft(spectrum_down_sampled));
t_down_sampled = ( (1:N_down_sampled)*1/SampleRate_down_sampled ).';

sound(y_down_sampled, SampleRate_down_sampled)

function [spectrum_filtered,g]=freq_space_low_pass_filter(spectrum, SampleRate, Freq3db)
%% applies low pass filter in the frequency domain
% spectrum - result of fft on time series data (column vector is expected)
% SampleRate - measured in Hz, 1/dt where dt spacing of the points in time domain
% Freq3db - desired 3db roll off point in Hz

N=length(spectrum);

function G=filter_gain(freq, Freq3db)
    G=1./(1+1i*freq/Freq3db); % this corresponds to low pass RC filter
end

spectrum_freq=fourier_frequencies(SampleRate, N);

% calculate filter gain for each spectrum frequency
g=filter_gain(spectrum_freq, Freq3db);
spectrum_filtered=spectrum.*g;

結束

任何幫助都將不勝感激。 謝謝!

我過濾后的原始信號的圖

如果您沒有有關噪聲的先驗信息,那么通常不建議進行濾波。 如果您知道噪聲能量集中在某個頻率以上,則您的概念會很好用。 然后,低通濾波可能會給您帶來可觀的SNR優勢,但會以丟失更高頻率的語音信息為代價。 但是同樣,這只有在您知道噪聲的平均頻譜輪廓時才有用。

您需要利用任何有關使噪聲與語音信號不同的信息。 頻譜相減技術可能會給您帶來更多好處。 如果樣本中的語音之前有噪音,則可以根據該信息制作補償濾波器。

就時頻響應而言,噪聲是什么樣的? 如果它是相對靜止的,則可以使用語音被高度調制(大約4Hz)的事實來估計不同頻帶中的SNR,然后以最差的SNR估計來衰減頻帶。

錄音中有多少個音頻通道? 如果大於1,並且目標音頻信號的空間位置不變,則可以使用互相關技術來改善SNR。

如果說的是人類的聲音,那么您可以安全地完全過濾掉500 Hz以下和8 kHz以下的所有頻率。 從那里,您可以更安全地確定哪些頻率掩蓋了語音。

如果您想作弊,可以用帶窄帶鈴鐺濾波器的參數均衡器給音頻樣本一個鏡頭,然后掃過500-8000 Hz范圍,直到發現:)盡管問題聽起來更像是家庭作業。 Matlab課程。

我的Matlab對於代碼太生銹了,但是可以嘗試以下一些操作:

  1. 添加500 Hz的高通濾波器
  2. 添加一個8 kHz的低通濾波器
  3. 在人耳最敏感的地方(例如4 kHz)添加一個窄鍾形濾波器。 將其提高6 dB,以清除其他頻率的掩蔽效果。
  4. 為了獲得更高的效果,也可以同時提升較高和較低的諧波(2 kHz和8 kHz),但降低幅度為dB

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM