Фильтрация данных в формате Wave с помощью scipy. Ввод, обработка и вывод - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь импортировать волновой файл, проанализировать его с помощью FFT (чтобы найти пики). Затем обработайте его с помощью фильтра (например, удалите шум). А затем экспортируйте его как новый волновой файл.

Кажется, что что-то происходит при фильтрации.

  1. данные импорта в порядке, фактический сигнал правильный.
  2. анализировать данные импорта в порядке, спецификации частоты верны.
  3. Ответ фильтра PLOT выглядит нормально, но я не уверен, что график представлен, затем обрабатывает фильтр.
  4. Фильтрация сигнала происходит неправильно, поскольку график дает неверные данные по оси времени при построении графика выхода фильтра, а спектр вывода смещается или вообще не дается в некоторых случаях.

    Я думаю, что импорт и так работает, я взял их из нескольких источников. основной источник: https://azitech.wordpress.com/2011/03/15/designing-a-butterworth-low-pass-filter-with-scipy/

    #designing filter.
    order = 10
    lowcut = 950
    highcut =  1050
    fs = 44100
    
    #^^^(fs) is this same sampling frequency of the import? 
    
    #find filter coefficients
    
    def butter_bandpass(lowcut, highcut, fs, order):
        nyq = 0.5 * fs
        low = lowcut / nyq
        high = highcut / nyq
        b, a = signal.butter(order, [low, high], btype='band')
        return b,a
    
    # Call filter to get coefficients
    b, a = butter_bandpass(lowcut,highcut,fs,order)
    
    print(b,a)
    
    # filter frequency response
    (w, h) = signal.freqz(b, a)
    fig.add_subplot(131)
    pyplot.plot((fs*0.5/numpy.pi)*w, numpy.abs(h)) #*w > fs*0.5/numpy.pi* 
    pyplot.title('Filter Respons Freq Domain')
    print('Order filter','=',order)
    pyplot.grid(True)
    
    # Also not sure why source plots it as fs*0.5/numpy.pi < although this gives the right x-axis (frequency) as the input (highcut and lowcut). 
    
    # filtered output
    #zi = signal.lfiltic(b, a, x[0:5], x[0:5])
    #(y, zi) = signal.lfilter(b, a, x, zi=zi)
    # ^^ not used. 
    
    y = signal.lfilter(b, a, data[:,0])
    
    pyplot.plot(t, y)
    pyplot.title('Filter Output Time Domain')
    pyplot.grid(True)
    

Конечным продуктом должен быть скрипт, способный импортировать файл wav (который представляет собой комбинацию интервью и шума (определенный пиковый шум)), анализировать его, чтобы достичь пиков, а затем экспортировать его как новый воспроизводимый волновой файл. .

...