[英]Apply frequency sampling filter on audio file
我正在嘗試使用從給定數據文件中進行頻率采樣的雙帶阻濾波器。 我使用的方法如下
給定頻率采樣文件的反fft( ifft
)
步驟1中給出的實際值的循環移位
執行步驟2的結果
使用卷積將過濾器應用於音頻文件。 (頻域)
問題在於,帶阻頻率(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);
有人可以幫我嗎?
前兩步
- 給定頻率采樣文件的反fft(
ifft
)- 步驟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
所做的遞歸過濾器不直接支持)。
頻域濾波
或者,您可以在頻域中執行過濾,
length(r)+length(wave)-1
的大小對步驟2的結果執行FFT wave
數據執行FFT ifft
) 可以使用以下方法實現:
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.