def comparePlot(signal1, signal2, Fs, fft_size=512, norm=False, equal=False, title1=None, title2=None): import matplotlib.pyplot as plt td_amp = np.maximum(np.abs(signal1).max(), np.abs(signal2).max()) if norm: if equal: signal1 /= np.abs(signal1).max() signal2 /= np.abs(signal2).max() else: signal1 /= td_amp signal2 /= td_amp td_amp = 1. plt.subplot(2,2,1) plt.plot(np.arange(len(signal1))/float(Fs), signal1) plt.axis('tight') plt.ylim(-td_amp, td_amp) if title1 is not None: plt.title(title1) plt.subplot(2,2,2) plt.plot(np.arange(len(signal2))/float(Fs), signal2) plt.axis('tight') plt.ylim(-td_amp, td_amp) if title2 is not None: plt.title(title2) import stft import windows eps = constants.get('eps') F1 = stft.stft(signal1, fft_size, fft_size / 2, win=windows.hann(fft_size)) F2 = stft.stft(signal2, fft_size, fft_size / 2, win=windows.hann(fft_size)) # try a fancy way to set the scale to avoid having the spectrum # dominated by a few outliers p_min = 1 p_max = 99.5 all_vals = np.concatenate((dB(F1+eps), dB(F2+eps))).flatten() vmin, vmax = np.percentile(all_vals, [p_min, p_max]) cmap = 'jet' interpolation='sinc' plt.subplot(2,2,3) stft.spectroplot(F1.T, fft_size, fft_size / 2, Fs, vmin=vmin, vmax=vmax, cmap=plt.get_cmap(cmap), interpolation=interpolation) plt.subplot(2,2,4) stft.spectroplot(F2.T, fft_size, fft_size / 2, Fs, vmin=vmin, vmax=vmax, cmap=plt.get_cmap(cmap), interpolation=interpolation)
def comparePlot(signal1, signal2, Fs, fft_size=512, norm=False, equal=False, title1=None, title2=None): import matplotlib.pyplot as plt td_amp = np.maximum(np.abs(signal1).max(), np.abs(signal2).max()) if norm: if equal: signal1 /= np.abs(signal1).max() signal2 /= np.abs(signal2).max() else: signal1 /= td_amp signal2 /= td_amp td_amp = 1. plt.subplot(2,2,1) plt.plot(np.arange(len(signal1))/float(Fs), signal1) plt.axis('tight') plt.ylim(-td_amp, td_amp) if title1 is not None: plt.title(title1) plt.subplot(2,2,2) plt.plot(np.arange(len(signal2))/float(Fs), signal2) plt.axis('tight') plt.ylim(-td_amp, td_amp) if title2 is not None: plt.title(title2) from constants import eps import stft import windows F1 = stft.stft(signal1, fft_size, fft_size / 2, win=windows.hann(fft_size)) F2 = stft.stft(signal2, fft_size, fft_size / 2, win=windows.hann(fft_size)) # try a fancy way to set the scale to avoid having the spectrum # dominated by a few outliers p_min = 1 p_max = 99.5 all_vals = np.concatenate((dB(F1+eps), dB(F2+eps))).flatten() vmin, vmax = np.percentile(all_vals, [p_min, p_max]) cmap = 'jet' interpolation='sinc' plt.subplot(2,2,3) stft.spectroplot(F1.T, fft_size, fft_size / 2, Fs, vmin=vmin, vmax=vmax, cmap=plt.get_cmap(cmap), interpolation=interpolation) plt.subplot(2,2,4) stft.spectroplot(F2.T, fft_size, fft_size / 2, Fs, vmin=vmin, vmax=vmax, cmap=plt.get_cmap(cmap), interpolation=interpolation)
def spectrum(signal, Fs, N): import stft import windows F = stft.stft(signal, N, N / 2, win=windows.hann(N)) stft.spectroplot(F.T, N, N / 2, Fs)
def __init__(self, N, fs, hop=None, analysis_window=None, synthesis_window=None, channels=1, transform='numpy'): """ Constructor for STFT class. Parameters ----------- N : int number of samples per frame fs : float Sampling frequency. hop : int hop size wA : numpy array analysis window wS : numpy array synthesis window channels : int number of signals """ # initialize parameters self.N = N # number of samples per frame self.fs = fs self.D = channels # number of channels if hop is not None: # hop size self.hop = hop else: self.hop = self.N/2 self.hop = int(np.floor(self.hop)) # analysis window if analysis_window is not None: self.analysis_window = analysis_window elif analysis_window is None and self.hop ==self.N/2: self.analysis_window = windows.hann(self.N) else: self.analysis_window = None # synthesis window if synthesis_window is not None: self.synthesis_window = synthesis_window elif synthesis_window is None and self.hop ==self.N/2: self.synthesis_window = None # rectangular window else: self.synthesis_window = None # create DFT object self.transform = transform self.nfft = self.N self.nbin = self.nfft // 2 + 1 self.freq = np.linspace(0,self.fs/2,self.nbin) self.dft = DFT(nfft=self.nfft,fs=self.fs,num_sig=self.D, analysis_window=self.analysis_window, synthesis_window=self.synthesis_window, transform=self.transform) self.fft_out_buffer = np.zeros(self.nbin, dtype=np.complex64) # initialize filter + zero padding --> use set_filter self.zf = 0; self.zb = 0 self.H = None # filter frequency spectrum # state variables self.num_frames = 0 # number of frames processed so far self.n_state = self.N - self.hop # allocate all the required buffers self.make_buffers()
def process(self): if (self.signals is None or len(self.signals) == 0): raise NameError('No signal to beamform') if self.processing is 'FrequencyDomain': # create window function win = np.concatenate((np.zeros(self.zpf), windows.hann(self.L), np.zeros(self.zpb))) # do real STFT of first signal tfd_sig = stft.stft(self.signals[0], self.L, self.hop, zp_back=self.zpb, zp_front=self.zpf, transform=np.fft.rfft, win=win) * np.conj(self.weights[0]) for i in xrange(1, self.M): tfd_sig += stft.stft(self.signals[i], self.L, self.hop, zp_back=self.zpb, zp_front=self.zpf, transform=np.fft.rfft, win=win) * np.conj(self.weights[i]) # now reconstruct the signal output = stft.istft( tfd_sig, self.L, self.hop, zp_back=self.zpb, zp_front=self.zpf, transform=np.fft.irfft) # remove the zero padding from output signal if self.zpb is 0: output = output[self.zpf:] else: output = output[self.zpf:-self.zpb] elif self.processing is 'TimeDomain': # go back to time domain and shift DC to center tw = np.sqrt(self.weights.shape[1])*np.fft.irfft(np.conj(self.weights), axis=1) tw = np.concatenate((tw[:, self.N/2:], tw[:, :self.N/2]), axis=1) from scipy.signal import fftconvolve # do real STFT of first signal output = fftconvolve(tw[0], self.signals[0]) for i in xrange(1, len(self.signals)): output += fftconvolve(tw[i], self.signals[i]) elif self.processing is 'Total': W = np.concatenate((self.weights, np.conj(self.weights[:,-2:0:-1])), axis=1) W[:,0] = np.real(W[:,0]) W[:,self.N/2] = np.real(W[:,self.N/2]) F_sig = np.zeros(self.signals.shape[1], dtype=complex) for i in xrange(self.M): F_sig += np.fft.fft(self.signals[i])*np.conj(W[i,:]) f_sig = np.fft.ifft(F_sig) print np.abs(np.imag(f_sig)).mean() print np.abs(np.real(f_sig)).mean() output = np.real(np.fft.ifft(F_sig)) return output
def process(self, FD=False): if self.signals is None or len(self.signals) == 0: raise NameError('No signal to beamform') if FD is True: # STFT processing if self.weights is None and self.filters is not None: self.weightsFromFilters() elif self.weights is None and self.filters is None: raise NameError('Beamforming weights or filters need to be computed first.') # create window function win = np.concatenate((np.zeros(self.zpf), windows.hann(self.L), np.zeros(self.zpb))) # do real STFT of first signal tfd_sig = stft.stft(self.signals[0], self.L, self.hop, zp_back=self.zpb, zp_front=self.zpf, transform=np.fft.rfft, win=win) * np.conj(self.weights[0]) for i in xrange(1, self.M): tfd_sig += stft.stft(self.signals[i], self.L, self.hop, zp_back=self.zpb, zp_front=self.zpf, transform=np.fft.rfft, win=win) * np.conj(self.weights[i]) # now reconstruct the signal output = stft.istft( tfd_sig, self.L, self.hop, zp_back=self.zpb, zp_front=self.zpf, transform=np.fft.irfft) # remove the zero padding from output signal if self.zpb is 0: output = output[self.zpf:] else: output = output[self.zpf:-self.zpb] else: # TD processing if self.weights is not None and self.filters is None: self.filtersFromWeights() elif self.weights is None and self.filters is None: raise NameError('Beamforming weights or filters need to be computed first.') from scipy.signal import fftconvolve # do real STFT of first signal output = fftconvolve(self.filters[0], self.signals[0]) for i in xrange(1, len(self.signals)): output += fftconvolve(self.filters[i], self.signals[i]) return output
import Room as rg import beamforming as bf from constants import eps from stft import stft, spectroplot import windows import utilities as u # Spectrogram figure properties figsize=(7.87, 1.65) # figure size figsize2=(7.87, 1.5*1.65) # figure size fft_size = 512 # fft size for analysis fft_hop = 8 # hop between analysis frame fft_zp = 512 analysis_window = np.concatenate((windows.hann(fft_size), np.zeros(fft_zp))) t_cut = 0.83 # length in [s] to remove at end of signal (no sound) # Some simulation parameters Fs = 8000 t0 = 1./(Fs*np.pi*1e-2) # starting time function of sinc decay in RIR response absorption = 0.90 max_order_sim = 10 SNR_at_mic = 20 # SNR at center of microphone array in dB # Room 1 : Shoe box room_dim = [4, 6] # the good source is fixed for all good_source = [1, 4.5] # good source normal_interferer = [2.8, 4.3] # interferer
import Room as rg import beamforming as bf from constants import eps from stft import stft, spectroplot import windows import utilities as u # Spectrogram figure properties figsize = (7.87, 1.65) # figure size figsize2 = (7.87, 1.5 * 1.65) # figure size fft_size = 512 # fft size for analysis fft_hop = 8 # hop between analysis frame fft_zp = 512 analysis_window = np.concatenate((windows.hann(fft_size), np.zeros(fft_zp))) t_cut = 0.83 # length in [s] to remove at end of signal (no sound) # Some simulation parameters Fs = 8000 t0 = 1. / (Fs * np.pi * 1e-2 ) # starting time function of sinc decay in RIR response absorption = 0.90 max_order_sim = 10 SNR_at_mic = 20 # SNR at center of microphone array in dB # Room 1 : Shoe box room_dim = [4, 6] # the good source is fixed for all good_source = [1, 4.5] # good source