Пример #1
0
    def __init__(self, in_channels, out_channels, kernel_size, stride=None, window_fn='hann', trainable=False):
        super().__init__()
        
        assert out_channels == 1, "out_channels is expected 1, given {}".format(out_channels)
        assert in_channels % (kernel_size*2) == 0, "in_channels % (kernel_size*2) is given {}".format(in_channels % (kernel_size*2))
        
        self.kernel_size, self.stride = kernel_size, stride
        
        repeat = in_channels//(kernel_size*2)
        self.repeat = repeat
        
        window = build_window(kernel_size, window_fn=window_fn) # (kernel_size,)
        optimal_window = build_optimal_window(window, hop_size=stride)

        cos_basis, sin_basis = build_Fourier_basis(kernel_size, normalize=True)
        cos_basis, sin_basis = cos_basis * optimal_window / repeat, - sin_basis * optimal_window / repeat
        
        basis = None
        
        for idx in range(repeat):
            rolled_cos_basis = torch.roll(cos_basis, kernel_size//repeat*idx, dims=1)
            rolled_sin_basis = torch.roll(sin_basis, kernel_size//repeat*idx, dims=1)
            if basis is None:
                basis = torch.cat([rolled_cos_basis, rolled_sin_basis], dim=0)
            else:
                basis = torch.cat([basis, rolled_cos_basis, rolled_sin_basis], dim=0)
        
        self.basis = nn.Parameter(basis.unsqueeze(dim=1), requires_grad=trainable)
Пример #2
0
    def __init__(self, fft_size, hop_size=None, window_fn='hann', normalize=False):
        super().__init__()
        
        if hop_size is None:
            hop_size = fft_size//2
        
        self.fft_size, self.hop_size = fft_size, hop_size
    
        window = build_window(fft_size, window_fn=window_fn) # (fft_size,)

        cos_basis, sin_basis = build_Fourier_basis(fft_size, normalize=normalize)
        cos_basis, sin_basis = cos_basis[:fft_size//2+1] * window, - sin_basis[:fft_size//2+1] * window
        
        basis = torch.cat([cos_basis, sin_basis], dim=0)
        
        self.basis = nn.Parameter(basis.unsqueeze(dim=1), requires_grad=False)