# -*- 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
今日推荐
周排行