0

非常にノイズの多い (低ドローンを追加したホワイト ノイズのような音) オーディオ ファイル (.wav) 内に隠されているメッセージを解読しようとしています。メッセージは 6 桁の数字です。騒音の詳細については何も知らされていません。高い周波数のほとんどを除去することで数字を聞くことができるようになることを期待して、ローパスフィルターを使用しようとしましたが、声を十分に聞くのに十分な低ドローンも取り除くことができないようです. 私の試みは次のとおりでした(採用された関数「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;

終わり

あらゆる支援をいただければ幸いです。ありがとう!

フィルター処理された信号と元の信号のプロット

4

2 に答える 2

0

数字を言っているのが人間の声である場合、500 Hz 未満およびそれ以上のすべての周波数 (たとえば 8 kHz) を安全に完全に除外できます。そこから、どの周波数が声をマスクするかをより安全に判断できます。

少しごまかしたい場合は、狭帯域のベル フィルターを備えたパラメトリック EQ でオーディオ サンプルを試して、何かが得られるまで 500 ~ 8000 Hz の範囲をスイープすることができます :) 問題は宿題のように聞こえますが、マトラブコース。

私の Matlab は錆びすぎてコードを作成できませんが、次のことを試してみてください。

  1. 500 Hz でハイパス フィルターを追加します。
  2. 8 kHz でローパス フィルターを追加します。
  3. たとえば、人間の耳が最も敏感な 4 kHz に狭いベル フィルターを追加します。6 dB ブーストして、他の周波数のマスキング効果を取り除きます。
  4. 追加の効果を得るには、低域と高域のハーモニクス (2 kHz と 8 kHz) もブーストしますが、dB は低くします。
于 2012-12-04T12:51:24.417 に答える
0

ノイズに関する事前情報がない場合、通常、フィルタリングは適切ではありません。ノイズ エネルギーが特定の周波数より上に集中していることがわかっている場合、このコンセプトはうまく機能します。ローパス フィルタリングを使用すると、高い周波数の音声情報が失われる代わりに、かなりの SNR の利点が得られる場合があります。ただし、これは、ノイズの平均スペクトル プロファイルがわかっている場合にのみ役立ちます。

ノイズと音声信号の違いについて、できる限りの情報を活用する必要があります。スペクトル減算法を使用すると、さらにメリットが得られる場合があります。サンプルの音声に先行するノイズがある場合は、その情報に基づいて補正フィルターを作成できます。

ノイズは時間周波数応答でどのように見えますか? 比較的安定している場合は、音声が高度に変調されている (約 4Hz) という事実を利用して、さまざまな周波数帯域で SNR を推定し、最悪の SNR 推定値で帯域を減衰させることができます。

録音には何チャンネルのオーディオが含まれていますか? 1 より大きく、ターゲット オーディオ ソースの空間位置が変わらない場合は、相互相関手法を使用して SNR を改善できます。

于 2012-12-04T08:28:43.030 に答える