def METHOD_NAME(self, f0):
    """sine_tensor, uv = forward(f0)
    input F0: tensor(batchsize=1, length, dim=1)
              f0 for unvoiced steps should be 0
    output sine_tensor: tensor(batchsize=1, length, dim)
    output uv: tensor(batchsize=1, length, 1)
    """
    with torch.no_grad():
        f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device)
        # print("f0_buf", f0_buf.shape)
        # print("f0", f0.shape)
        # fundamental component
        f0_buf[:, :, 0] = f0[:, :, 0]
        for idx in np.arange(self.harmonic_num):
            # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic
            f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * (idx + 2)
        # generate sine waveforms
        sine_waves = self._f02sine(f0_buf) * self.sine_amp
        # generate uv signal
        # uv = torch.ones(f0.shape)
        # uv = uv * (f0 > self.voiced_threshold)
        uv = self._f02uv(f0)
        # noise: for unvoiced should be similar to sine_amp
        #        std = self.sine_amp/3 -> max value ~ self.sine_amp
        # .       for voiced regions is self.noise_std
        noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3
        noise = noise_amp * torch.randn_like(sine_waves)
        # first: set the unvoiced part to 0 by uv
        # then: additive noise
        sine_waves = sine_waves * uv + noise
    return sine_waves, uv, noise