语音识别(三):基于傅里叶变换的频率域滤波

# -*- coding: utf-8 -*-
import os
import sys
import platform
import numpy as np
import numpy.fft as nf 
import scipy.io.wavfile as wf 
import matplotlib.pyplot as mp 

def nosies_signals(duration,sample_rate,signal_freq):
  times = np.linspace(0,duration,duration*sample_rate)
  noised_sigs = np.sin(2*np.pi*signal_freq*times) + np.random.randn(times.size)/2
  return times,noised_sigs


def time2freq(sigs,sample_rate):
  freqs = nf.fftfreq(sigs.size,d=1/sample_rate)
  ffts = nf.fft(sigs)
  amps = np.abs(ffts)
  return freqs,ffts,amps 

def freq2time(ffts):
  sigs = nf.ifft(ffts)
  return sigs.real

def filter(freqs,noised_ffts,noised_amps):
  fund_freq = [noised_amps.argmax()]
  height_freqs = np.where(np.abs(freqs) != fund_freq)
  filtered_ffts = noised_ffts.copy()
  filtered_ffts[height_freqs] = 0
  filtered_amps = noised_amps.copy()
  filtered_amps[height_freqs] = 0
  return fund_freq,filtered_ffts,filtered_amps 

def save_signals(filename,sample_rate,sigs):
  wf.write(filename,sample_rate,(sigs/np.max(sigs)*2**15).astype(np.int16))


def init_noised_signals():
  mp.gcf().set_facecolor(np.ones(3)*240/255)
  mp.subplot(221)
  mp.title('Noised Signal',fontsize=20)
  mp.xlabel('Time(ms)',fontsize=14)
  mp.ylabel('Signal',fontsize=14)
  mp.tick_params(which='both',top=True,right=True,labelright=True,labelsize=10)
  mp.grid(linestyle=':')

def draw_noised_signals(times,noised_sigs):
  times,noised_sigs = times[:200]*1000,noised_sigs[:200]
  times *= 1000
  mp.plot(times,noised_sigs,c='orangered',label='Noised',zorder=0)
  mp.scatter(times,noised_sigs,edgecolor='orangered',facecolor='white',label='Sample',zorder=1)
  mp.legend()  



def init_noised_amplitudes():
  mp.subplot(222)
  mp.title('Noised Amplitude',fontsize=16)
  mp.xlabel('Frequency(KHz)',fontsize=12)
  mp.ylabel('Amplitude',fontsize=12)
  mp.tick_params(which='both',top=True,right=True,labelright=True,labelsize=10)
  mp.grid(linestyle=':')

def draw_noised_amplitudes(freqs,amps):
  amps = amps[freqs>=0]
  freqs = freqs[freqs>=0]/1000
  mp.semilogy(freqs,amps,c='orangered',label='Amplitude')
  #mp.scatter(times,sigs,edgecolor='orangered',facecolor='white',s=80,label='Sample',zorder=1)
  mp.legend()


def init_filtered_signals():
  mp.gcf().set_facecolor(np.ones(3)*240/255)
  mp.subplot(223)
  mp.title('Filtered Signal',fontsize=20)
  mp.xlabel('Time(ms)',fontsize=14)
  mp.ylabel('Signal',fontsize=14)
  mp.tick_params(which='both',top=True,right=True,labelright=True,labelsize=10)
  mp.grid(linestyle=':')

def draw_filtered_signals(times,filtered_sigs):
  times,filtered_sigs = times[:200]*1000,filtered_sigs[:200]
  times *= 1000
  mp.plot(times,filtered_sigs,c='orangered',label='Noised',zorder=0)
  mp.scatter(times,filtered_sigs,edgecolor='hotpink',facecolor='white',label='Sample',zorder=1)
  mp.legend()  


def init_filtered_amplitudes():
  mp.subplot(224)
  mp.title('Filtered Amplitude',fontsize=16)
  mp.xlabel('Frequency(KHz)',fontsize=12)
  mp.ylabel('Amplitude',fontsize=12)
  mp.tick_params(which='both',top=True,right=True,labelright=True,labelsize=10)
  mp.grid(linestyle=':')

def draw_filtered_amplitudes(times,amps):
  amps = amps[freqs >= 0] + 1
  freqs = freqs[freqs>=0]/1000
  mp.plot(freqs,amps,c='dodgerblue',label='Filtered')
  #mp.scatter(times,sigs,edgecolor='orangered',facecolor='white',s=80,label='Sample',zorder=1)
  mp.legend()



def show_chart():
  mng = mp.get_current_fig_manager()
  if 'Windows' in platform.system():
    mng.window.state('zoomed')
  else:
    mng.resize(*mng.window.maxsize())
  mp.tight_layout()
  mp.show()



def main(argc,argv,envp):
  duration = 5
  sample_rate = 44100
  signal_freq = 1000
  times,noised_sigs= nosies_signals(duration,sample_rate,signal_freq)
  freqs,noised_ffts,noised_amps = time2freq(noised_sigs,sample_rate)
  fund_freq,filtered_ffts,filtered_amps = filter(freqs,noised_ffts,noised_amps)
  filtered_sigs =  freq2time(filtered_ffts)

  save_signals('noised.wav',sample_rate,noised_sigs)
  save_signals('filtered.wav',sample_rate,filtered_sigs)
  # sigs,sample_rate,times = read_signals('/Users/youkechaung/Desktop/算法/数据分析/AI/day02/day02/data/freq.wav')
  # freqs,ffts,amps = time2freq(sigs,sample_rate)
  # time2freq(sigs,sample_rate)
  # init_signals()
  # draw_signals(times,sigs)
  init_noised_signals()
  draw_noised_signals(times,noised_sigs)
  init_noised_amplitudes()
  draw_noised_amplitudes(freqs,noised_amps)
  init_filtered_amplitudes()
  draw_filtered_amplitudes(freqs,filtered_amps)
  show_chart()
  return 0

if __name__ == '__main__':
  sys.exit(main(len(sys.argv),sys.argv,os.environ))

猜你喜欢

转载自blog.csdn.net/weixin_38246633/article/details/80665240