Esempio n. 1
0
    def update(self,
               nprocs=1,
               factor=None,
               bw_hz=None,
               foi_hz=None,
               fs_hz=None,
               f_ord=None,
               ftype=None,
               n_freqs=None,
               n_samples=None,
               n_channels=None):

        self.n_channels = n_channels if n_channels is not None else self.n_channels
        self.n_freqs = n_freqs if n_freqs is not None else self.n_freqs
        self.n_processes = min(Parallel.check_nprocs() -
                               1, self.n_freqs) if nprocs != 1 else 1

        # Signal process properties
        self.decimate_by = factor
        self.n_samples = int(n_samples / self.decimate_by)
        self.sample_rate = fs_hz / self.decimate_by if fs_hz is not None else self.sample_rate

        self.bandwidth = bw_hz if bw_hz is not None else self.bandwidth

        self.w_, self.H_ = self.create_filter(f_ord,
                                              self.bandwidth / 2.0,
                                              self.sample_rate / 2.0,
                                              self.n_samples,
                                              ftype='fir',
                                              output='freq')
        self.Hwin = self.H_[np.logical_and(self.w_ >= -self.bandwidth / 2.0,
                                           self.w_ < self.bandwidth / 2.0)]

        self.n_samples_procs = self.Hwin.size

        # Setup center frequencies
        if len(foi_hz) > 1:
            cf = np.arange(*foi_hz, np.diff(foi_hz) / self.n_freqs, dtype=int)
            diff = cf.shape[0] - self.n_freqs
            if diff > 0:
                cf = cf[:-diff]
        else:
            cf = foi_hz

        self.freqs = np.asarray([
            (f - self.bandwidth / 2, f + self.bandwidth / 2) for f in cf
        ])

        # Create rules for how to handle the data
        self._encoder_rule()
        self._decoder_rule()

        if self.n_processes > 1:
            self.pfunc = Parallel(self.multiply,
                                  nprocs=self.n_processes,
                                  axis=0,
                                  flag=0,
                                  ins_shape=[(self.n_channels, self.n_freqs,
                                              self.n_samples_procs),
                                             (1, self.n_samples_procs)],
                                  ins_dtype=[np.complex64, np.complex64],
                                  out_shape=(self.n_channels, self.n_freqs,
                                             self.n_samples_procs),
                                  out_dtype=np.complex64)