[英]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.