音频信号傅立叶变换的滤波
Filtering of fourier transforms of audio signals
我有一个数组,其中包含输入音频信号的傅里叶变换(对应于各种频率的振幅)。我希望 select 信号的特定范围 而不使用内置函数 。我已经执行了以下简单操作:
[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
.
错误在于以下代码行:
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 < conjf.所以在代码的最后一行,我跨越了向量,初始点大于终点。但是,使用以下代码行,此问题已解决:
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);
我有一个数组,其中包含输入音频信号的傅里叶变换(对应于各种频率的振幅)。我希望 select 信号的特定范围 而不使用内置函数 。我已经执行了以下简单操作:
[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
.
错误在于以下代码行:
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 < conjf.所以在代码的最后一行,我跨越了向量,初始点大于终点。但是,使用以下代码行,此问题已解决:
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);