กรองข้อความจากสัญญาณเสียงที่มีเสียงดัง


9

ฉันพยายามถอดรหัสข้อความที่ซ่อนอยู่ในไฟล์เสียงที่มีเสียงดังมาก (.wav) (ฉันคิดว่ามันเป็นเสียงสีขาวพร้อมเสียงพึมพำเพิ่มเติม) ข้อความที่เป็นเลขหกหลัก ฉันไม่มีรายละเอียดเพิ่มเติมเกี่ยวกับเสียงรบกวน

ฉันพยายามใช้ตัวกรอง low-pass ด้วยความหวังว่าการกำจัดความถี่ที่สูงกว่าส่วนใหญ่จะทำให้ฉันได้ยินตัวเลข แต่ดูเหมือนว่าฉันจะไม่สามารถกำจัดเสียงพึมพำต่ำพอที่จะได้ยินเสียงได้ดีพอ ความพยายามของฉันเป็นดังนี้ (ฟังก์ชั่นการจ้างงาน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;
end

พล็อตของสเปกตรัมสัญญาณ: ภาพ


คุณสามารถให้ตัวอย่างที่คุณใช้กับเราได้หรือไม่ และผลลัพธ์ของคุณอาจ?
Penelope

ฉันไม่สามารถอัปโหลดภาพพล็อต (จุดไม่เพียงพอ) และไม่มีทางเชื่อมโยงคุณไปยังไฟล์
user1825494

1
ถ้าคุณใส่ลิงค์ในความคิดเห็นบางคนก็ยินดีที่จะแก้ไขมันและถ้าคุณหาวิธีอัปโหลดไฟล์ที่อื่นและให้ลิงค์ให้กลับไปที่นั่น
Penelope

2
กราฟจะมีข้อมูลมากขึ้นถ้ามันเป็นบันทึกการลงจุด ดูเหมือนว่าคุณจะมีเสียงรบกวนจากย่านความถี่กว้างประมาณ 1.5 kHz ถึง 22.5 kHz โดยมีระดับเสียงที่แคบประมาณ 2 kHz สิ่งที่ฉันเข้าใจคือสัญญาณ "เสียง" พร้อมกับสิ่งที่ดูเหมือนจะเป็น DC ออฟเซ็ตที่สำคัญอยู่ใน "หลุม" ที่ค่อนข้างเงียบ มันไม่ควรจะเป็นเรื่องยากที่จะแยกด้วยตัวกรอง bandpass ที่เหมาะสม
Dave Tweed

คำตอบ:


1

คะแนนน้อย:

  1. การกรองในโดเมนความถี่นั้นซับซ้อนและต้องการอัลกอริทึมจริงเช่นการเพิ่มการเหลื่อมกันเพื่อหลีกเลี่ยงการใช้ชื่อแทนโดเมนเวลา การกรองโดยตรงในโดเมนเวลาง่ายขึ้น: [b, a] = butter (1,100 / (SampleRate / 2); y_filtered = filter (b, a, y) ดีกว่ามาก
  2. คุณอาจต้องการใส่ตัวกรองรอยบนความถี่เสียงพึมพำ
  3. สำหรับสัญญาณรบกวนในวงกว้างวิธีที่ดีคือการกรอง Wiener หรือการลบสเปกตรัม เอกสารจำนวนมากได้รับการตีพิมพ์ในเรื่องนี้

0

คุณพูดถึงการใช้ตัวกรองความถี่ต่ำ แต่ในฐานะที่เป็นหนึ่งในผู้แสดงความคิดเห็นที่กล่าวถึงคุณอาจจะทำได้ดีกว่าด้วยตัวกรองสัญญาณผ่านความถี่เพื่อกรองสัญญาณรบกวนความถี่ต่ำ นอกจากนี้ยังมีตัวกรองลดเสียงรบกวนในห้องสมุดบุคคลที่สามหากคุณสนใจวิธีแก้ไขปัญหาที่มีอยู่แล้ว


0

เสียงของมนุษย์มีลักษณะเฉพาะบางอย่างที่อาจช่วยได้ สำหรับหนึ่งเสียงของผู้หญิงเริ่มที่ประมาณ 200Hz ต่ำกว่าตัวผู้ดังนั้นการทำฟิลเตอร์ high-passที่นี่จะช่วยได้บ้าง ดูเพิ่มเติมคุณสมบัติอะคูสติกที่แตกต่างที่เป็นเพศชายและเพศหญิงเสียง

นอกจากนี้ให้ระบุความถี่เสียงหึ่งๆผ่านฮิสโตแกรม

การทำทั้งหมดนี้ในโค้ดนั้นค่อนข้างยุ่งยาก คุณเคยพิจารณาโปรแกรมเสียงเช่นAudacityบ้างไหม?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.