繁体   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