예제 #1
0
 def energy_envelope(self):
     sig = get_sig(self.args)
     nfft = unroll_args(self.args, ['nfft'])
     sig = np.abs(sig)
     hann_window = _cached_get_window('hanning', nfft)
     envelope = np.convolve(sig, hann_window, 'same')
     return envelope
예제 #2
0
 def time_axis(self):
     sig = get_sig(self.args)
     fs = unroll_args(self.args, ['fs'])
     length = len(sig)
     t_end_sec = length / fs
     time = np.linspace(0, t_end_sec, length)
     return time
예제 #3
0
 def zero_crossing_rate(self):
     sig = get_sig(self.args)
     nfft, noverlap = unroll_args(self.args, ['nfft', 'noverlap'])
     hopsize = nfft - noverlap
     zcr = rosaft.zero_crossing_rate(y=sig,
                                     frame_length=nfft,
                                     hop_length=hopsize,
                                     center=False)
     return zcr
예제 #4
0
    def lp_coefficients(self):
        sig = get_sig(self.args)
        nfft, fs, noverlap, win_length, order = unroll_args(
            self.args, ['nfft', 'fs', 'noverlap', 'win_length', 'order'])
        hann_window = _cached_get_window('hanning', nfft)
        window = unroll_args(self.args, [('window', hann_window)])

        siglen = len(sig)
        nsegs, segs = split_segments(siglen,
                                     win_length,
                                     noverlap,
                                     incltail=False)

        lp_coeffs = np.zeros((order, nsegs), dtype=np.float32)
        for i in range(nsegs):
            seg_beg, seg_end = segs[i]
            frame = sig[seg_beg:seg_end]

            lp_coeffs[:, i] = lp_coefficients_frame(frame * window, order)
        return lp_coeffs
예제 #5
0
    def lpc_spectrum(self):
        sig = get_sig(self.args)
        nfft, fs, noverlap, win_length, order = unroll_args(
            self.args, ['nfft', 'fs', 'noverlap', 'win_length', 'order'])
        hann_window = _cached_get_window('hanning', nfft)
        window = unroll_args(self.args, [('window', hann_window)])

        siglen = len(sig)
        nsegs, segs = split_segments(siglen,
                                     win_length,
                                     noverlap,
                                     incltail=False)

        lpcs = np.zeros((nfft, nsegs), dtype=np.complex64)
        for i in range(nsegs):
            seg_beg, seg_end = segs[i]
            frame = sig[seg_beg:seg_end]

            lpcs[:, i] = lpc_spectrum_frame(frame * window, order, nfft)
        return np.log10(abs(lpcs))
예제 #6
0
def _harmonic_and_pitch(args):
    """
    Computes harmonic ratio and pitch
    """
    sig = get_sig(args)
    fs, noverlap, win_length = unroll_args(args,
                                           ['fs', 'noverlap', 'win_length'])
    siglen = len(sig)
    nsegs, segs = split_segments(siglen, win_length, noverlap, incltail=False)

    HRs = []
    F0s = []

    for i in range(nsegs):
        seg_beg, seg_end = segs[i]
        frame = sig[seg_beg:seg_end]

        M = int(np.round(0.016 * fs) - 1)
        R = np.correlate(frame, frame, mode='full')

        g = R[len(frame) - 1]
        R = R[len(frame):-1]

        # estimate m0 (as the first zero crossing of R)
        [
            a,
        ] = np.nonzero(np.diff(np.sign(R)))

        if len(a) == 0:
            m0 = len(R) - 1
        else:
            m0 = a[0]
        if M > len(R):
            M = len(R) - 1

        Gamma = np.zeros(M, dtype=np.float64)
        CSum = np.cumsum(frame**2)
        Gamma[m0:M] = R[m0:M] / (np.sqrt((g * CSum[M:m0:-1])) + eps)

        ZCR = frame_zcr(Gamma)

        if ZCR > 0.15:
            HR = 0.0
            f0 = 0.0
        else:
            if len(Gamma) == 0:
                HR = 1.0
                blag = 0.0
                Gamma = np.zeros(M, dtype=np.float64)
            else:
                HR = np.max(Gamma)
                blag = np.argmax(Gamma)

            # Get fundamental frequency:
            f0 = fs / (blag + eps)
            if f0 > 5000:
                f0 = 0.0
            if HR < 0.1:
                f0 = 0.0

        HRs.append(HR)
        F0s.append(f0)

    return np.array(HRs), np.array(F0s)
예제 #7
0
 def chroma_cens(self):
     sig = get_sig(self.args)
     fs, nfft, noverlap = unroll_args(self.args, ['fs', 'nfft', 'noverlap'])
     hopsize = nfft - noverlap
     return rosaft.chroma_cens(y=sig, sr=fs, hop_length=hopsize)
예제 #8
0
 def tonnetz(self):
     sig = get_sig(self.args)
     fs = self.args['fs']
     return rosaft.tonnetz(y=sig, sr=fs)