【问题标题】:Filtering of fourier transforms of audio signals音频信号的傅立叶变换滤波
【发布时间】:2019-07-02 16:57:17
【问题描述】:

我有一个数组,其中包含输入音频信号的傅里叶变换(对应于各种频率的幅度)。我希望选择特定的信号范围不使用内置功能。我已经执行了以下简单的操作:

[audio_in,audio_freq_sampl]=audioread('F:\Signals and Systems\Take Me Home Country Roads (John Denver Cover).wav');
Length_audio=length(audio_in);
df=audio_freq_sampl/Length_audio;
frequency_audio=-audio_freq_sampl/2:df:audio_freq_sampl/2-df;
figure
FFT_audio_in=fft(audio_in);

n = length(FFT_audio_in);
init = 30000;
fin = 40000;  
conji= mod((n-init+2),n) ;
conjf= mod((n-fin+2),n) ;
fs_1(1:n) = 0.0 ;
fs_1(init:fin) = FFT_audio_in(init:fin);
fs_1(conji:conjf) = FFT_audio_in(conji:conjf);

plot(frequency_audio,abs(fs_1));

正如我们在这里看到的,只有一个峰值。另一个应该在该范围内绘图的另一端可见。

这首歌可以在这里找到 - https://www.youtube.com/watch?v=WF046Z5tPJE

歌曲在阅读前必须转换为.wav文件。

上面的代码应该给我一个包含两个与频率范围相对应的小峰值的图 - (init , fin)(conji , conjf)。但是,我得到的峰值仅对应于第一个范围。 这两个范围都在数组的大小范围内 - FFT_audio_in

【问题讨论】:

  • 定义内置函数 您正在使用很多内置函数。另外,发布一个可重现的示例。我们看不到您所指的图表或峰值
  • 当然。有bandpass等matlab 2018版开发的函数。是的。我会附上一个例子。
  • 我在弄清楚后添加了一个答案。不过我不会接受。如果有人提出更好的方法,我将非常乐意接受他们的回答。 :)

标签: arrays matlab filtering signal-processing bandpass-filter


【解决方案1】:

错误在于以下代码行:

n = length(FFT_audio_in);
init = 30000;
fin = 40000;  
conji= mod((n-init+2),n) ;
conjf= mod((n-fin+2),n) ;
fs_1(1:n) = 0.0 ;
fs_1(init:fin) = FFT_audio_in(init:fin);
fs_1(conji:conjf) = FFT_audio_in(conji:conjf);

原来在上面的代码行中,conji

n = length(FFT_audio_in);
init = n/4;
fin = n/4 + 10000;  
conji= mod((n-init+2),n) ;
conjf= mod((n-fin+2),n) ;
init_2 = min(conji , conjf);
fin_2 = max(conji , conjf);
fs_1(1:n) = 0.0 ;
fs_1(init:fin) = FFT_audio_in(init:fin);
fs_1(init_2:fin_2) = FFT_audio_in(init_2:fin_2);

【讨论】:

  • 你还在用很多内置函数……你一开始说不想用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多