【问题标题】:How to isolate a frequency range in MATLAB using signals concepts?如何使用信号概念在 MATLAB 中隔离频率范围?
【发布时间】:2016-08-26 17:42:23
【问题描述】:

我正在尝试使用在信号分析中学到的概念从声音文件中分离出特定频率。我有一个简短的 WAV 文件,其中包含一个人在说话,但在所需信号的上方和下方也有其他未知频率的噪音。对于应该包含我想要的声音部分的频率范围,我有一个上限和下限。

我认为我应该能够在不使用信号分析工具箱或黄油过滤器的情况下做到这一点。

到目前为止,我有这段代码可以绘制信号的功率谱:

[y, Fs] = audioread('filename.wav','double');
t = 1:1:length(y);

y = transpose(y);
a = ifft(y);
a_k = abs([a((length(y)/2)+1:-1:2),a(1:1:(length(y)/2)+1)]);
bar((-length(y)/2)+1:1:(length(y)/2),a_k);

功率谱如下所示:

我认为我应该能够使用我所拥有的东西来过滤高于或低于我已知范围的任何东西,但我不知道如何开始这样做。

【问题讨论】:

    标签: matlab audio signals signal-processing


    【解决方案1】:

    要应用理想的带通滤波器,您可以使用以下代码。但是,请注意,如果您的信号不是周期性的,理想的滤波器可能不会产生最佳结果(请参阅 wiki 文章 here)。

    %% Initialisation
    Fs = 44100;
    t0 = 0;
    t1 = 1;
    t = t0 : 1/Fs : t1;
    
    f1 = 10;
    f2 = 40;
    y = 10*cos(2*pi*f1*t) + 20*sin(2*pi*f2*t);
    
    %% Cosine series
    
    true_fft = fft(y);
    
    nfft = length(y);
    
    % The number of unique points
    if mod(nfft, 2) == 0
        num_pts = round(nfft/2) + 1;
    else
        num_pts = ceil(nfft/2);
    end
    
    % The vector that contains only unique points
    fftT = true_fft(1 : num_pts);
    
    % The vector that contains the unique frequencies
    u_f = (0 : num_pts-1)*Fs/nfft;
    
    %% Filtered signal
    
    % Definition of the frequency band
    f_low = 5;
    f_high = 15;
    
    [~, idx_low] = min(abs(u_f - f_low));
    [~, idx_high] = min(abs(u_f - f_high));
    
    filtFFTT = fftT;
    filtFFTT([1: idx_low idx_high : end]) = 0;
    
    if mod(nfft, 2) == 0
        filtFFTT = [filtFFTT conj(filtFFTT((end - 1) : -1 : 2))];
    else
        filtFFTT = [filtFFTT conj(filtFFTT(end : -1 : 2))];
    end
    
    
    %% Data visualisation
    figure;
    plot(t, ifft(filtFFTT));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2021-08-28
      • 1970-01-01
      • 2017-03-01
      • 2013-03-13
      相关资源
      最近更新 更多