簡體   English   中英

在音頻文件上應用頻率采樣過濾器

[英]Apply frequency sampling filter on audio file

我正在嘗試使用從給定數據文件中進行頻率采樣的雙帶阻濾波器。 我使用的方法如下

  1. 給定頻率采樣文件的反fft( ifft

  2. 步驟1中給出的實際值的循環移位

  3. 執行步驟2的結果

  4. 使用卷積將過濾器應用於音頻文件。 (頻域)

問題在於,帶阻頻率(925Hz和2090Hz)仍然存在。 我的代碼有問題嗎?還是我錯過了什么?

[wave,fs]=audioread('audio.WAV'); 
data=importdata ('freqSampling.txt')

y=(ifft(data,401))
x=real (y)

r=circshift (x,200)

f=fft (r,4096);

new_sound=conv (wave, f)
sound(new_sound,fs,16);

頻譜

有人可以幫我嗎?

在ifft之前繪制的數據文件

前兩步

  1. 給定頻率采樣文件的反fft( ifft
  2. 步驟1中給出的實際值的循環移位

應該提供給您根據規范構造的濾波器的時域系數,前提是freqSampling.txt文件正確指定了所需的完整雙面頻譜(請參見下面的“驗證規范”)。 如果頻率規格中包含陡峭的瞬變,則可能需要調整/增加ifft點的數量。 但是,如您在步驟4中指示的那樣,在頻域中執行卷積並不對應於典型的濾波操作,而是等效於兩個信號的時域相乘。

時域過濾

根據第2步的結果,您可以使用任一conv在時域中直接過濾wave數據:

new_sound = conv(r, wave);

filter

new_sound = filter(r, 1, wave);

conv將為您提供完整的length(wave)+length(r)-1卷積,而filter是面向信號處理的函數,返回卷積的第一個length(wave)樣本(並且還可以處理conv所做的遞歸過濾器不直接支持)。

頻域濾波

或者,您可以在頻域中執行過濾,

  1. 使用至少為length(r)+length(wave)-1的大小對步驟2的結果執行FFT
  2. 使用與步驟3中相同的大小對wave數據執行FFT
  3. 使用乘法(頻域)將過濾器應用於音頻文件。
  4. 計算第5步結果的逆FFT( ifft
  5. 取步驟6的結果的真實部分(技術上不是必需的,但由於較小的數字舍入誤差經常需要)

可以使用以下方法實現:

N = length(wave)+length(r)-1;
wave_fd = fft(wave, N);              % step 3
filter_fd = fft(r, N);               % step 4

filtered_fd = wave_fd .* filter_fd;  % step 5
new_sound = real(ifft(filtered_fd)); % step 6 & 7

請注意,您還可以使用overlay-add方法以較小的塊執行此頻域過濾操作。

驗證規格

根據您的評論,可以使用以下方法重建從freqSampling.txt文件導入的data

N = 401;
data = ones(N,1);
data(19:23) = [2 1 0 1 2]/3;
data(51:56) = [2 1 0 1 2]/3;
data(N-[2:(N+1)/2]+2) = data([2:(N+1)/2]);

為了驗證這將過濾所需的頻率,我們可以將此規格繪制為頻率的函數。 為此,我們需要使用采樣率( fs ),根據您的圖表,該采樣率似乎為22050。 然后,您應該能夠使用以下方法繪制這些圖形:

hold off; plot([0:N-1]*fs/N, data);
hold on;  plot([925 925;2090 2090]', [0 1.2;0 1.2]', 'k:');
axis([0 3000 0 1.2]);
xlabel('Frequency (Hz)');
ylabel('Amplitude');
legend('Specs', 'Tones');

應該給出如下圖: 越野車規格

基於此,規格似乎在音調頻率上沒有提供任何衰減。 可以使用以下方法構建更好的擬合:

N = 401;
data = ones(N,1);
data(round(925*N/fs)+1+[-2:2]) = [2 1 0 1 2]/3;  % data([16:20])
data(round(2090*N/fs)+1+[-2:2]) = [2 1 0 1 2]/3; % data([37:41])
data(N-[2:(N+1)/2]+2) = data([2:(N+1)/2]);

生成如下所示的驗證圖: 調整后的規格

PS:根據信號的頻域圖,似乎第二個音調更接近2600Hz,而不是指示的2090Hz。

暫無
暫無

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

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