예제 #1
0
def do_CWT(*args, **kwargs):
    toc = kwargs.get('toc')
    if not toc:
        raise Exception('Trabalhando somente com o TrackObjectController.')
    #

    #    obj = args[0]
    UIM = UIManager()
    dlg = UIM.create('dialog_controller', title='Continuous Wavelet Transform')
    #
    try:
        ctn_wavelet = dlg.view.AddCreateContainer('StaticBox',
                                                  label='Wavelet',
                                                  orient=wx.VERTICAL,
                                                  proportion=0,
                                                  flag=wx.EXPAND | wx.TOP,
                                                  border=5)
        dlg.view.AddChoice(ctn_wavelet,
                           proportion=0,
                           flag=wx.EXPAND | wx.TOP,
                           border=5,
                           widget_name='wavelet',
                           options=WAVELET_TYPES)
        #
        ctn_scale_res = dlg.view.AddCreateContainer('StaticBox',
                                                    label='Scale resolution',
                                                    orient=wx.VERTICAL,
                                                    proportion=0,
                                                    flag=wx.EXPAND | wx.TOP,
                                                    border=5)
        dlg.view.AddTextCtrl(ctn_scale_res,
                             proportion=0,
                             flag=wx.EXPAND | wx.TOP,
                             border=5,
                             widget_name='dj',
                             initial='0.125')
        #
        dlg.view.SetSize((230, 260))
        result = dlg.view.ShowModal()
        if result == wx.ID_OK:
            results = dlg.get_results()
            print(results)
            dj = None
            try:
                dj = float(results.get('dj'))
            except:
                pass
            if dj is None:
                return
            wavelet = results.get('wavelet')
            if wavelet == 'morlet':
                func = MorletWavelet()
            elif wavelet == 'ricker':
                func = RickerWavelet()
            elif wavelet == 'dog3':
                func = DOGWavelet(m=3)
            elif wavelet == 'dog4':
                func = DOGWavelet(m=4)
            elif wavelet == 'dog5':
                func = DOGWavelet(m=5)
            elif wavelet == 'dog6':
                func = DOGWavelet(m=6)
            elif wavelet == 'paul2':
                func = PaulWavelet(m=2)
            elif wavelet == 'paul3':
                func = PaulWavelet(m=3)
            elif wavelet == 'paul4':
                func = PaulWavelet(m=4)
            elif wavelet == 'paul5':
                func = PaulWavelet(m=5)
            elif wavelet == 'paul6':
                func = PaulWavelet(m=6)
            else:
                raise Exception()

                # TODO: Rever tudo isso abaixo
            valid_data = obj.data[np.isfinite(obj.data)]
            valid_index_data = obj.get_indexes().data[np.isfinite(obj.data)]

            #
            wt = WaveletTransform(valid_data,
                                  dj=dj,
                                  wavelet=func,
                                  dt=obj.step,
                                  time=valid_index_data)
            #
            OM = ObjectManager()
            seismic = OM.new('scalogram',
                             wt.wavelet_power,
                             name=obj.name + '_CWT',
                             unit='m',
                             domain='depth',
                             sample_rate=wt.time[1] - wt.time[0],
                             datum=wt.time[0],
                             samples=len(wt.time),
                             frequencies=wt.fourier_frequencies,
                             periods=wt.fourier_periods,
                             scales=wt.scales)
            OM.add(seismic)
            print(wt.wavelet_transform.shape)
            #
    except Exception:
        pass
    finally:
        UIM.remove(dlg.uid)
예제 #2
0
def do_STFT(*args, **kwargs):
    toc = kwargs.get('toc')
    if not toc:
        raise Exception('Trabalhando somente com o TrackObjectController.')
    #
    OM = ObjectManager()
    UIM = UIManager()
    dlg = UIM.create('dialog_controller', title='Short Time Fourier Transform')
    #
    try:
        ctn_spec_type = dlg.view.AddCreateContainer('StaticBox',
                                                    label='Spectrogram type',
                                                    orient=wx.VERTICAL,
                                                    proportion=0,
                                                    flag=wx.EXPAND | wx.TOP,
                                                    border=5)
        dlg.view.AddChoice(ctn_spec_type,
                           proportion=0,
                           flag=wx.EXPAND | wx.TOP,
                           border=5,
                           widget_name='spectrogram_type',
                           options=SPECGRAM_TYPES)
        #
        ctn_win_size = dlg.view.AddCreateContainer(
            'StaticBox',
            label='Window size (samples)',
            orient=wx.VERTICAL,
            proportion=0,
            flag=wx.EXPAND | wx.TOP,
            border=5)
        dlg.view.AddSpinCtrl(ctn_win_size,
                             proportion=0,
                             flag=wx.EXPAND,
                             widget_name='window_size',
                             max=1024,
                             initial=256)
        #
        ctn_overlap_size = dlg.view.AddCreateContainer(
            'StaticBox',
            label='Overlap size (samples)',
            orient=wx.VERTICAL,
            proportion=0,
            flag=wx.EXPAND | wx.TOP,
            border=5)
        dlg.view.AddSpinCtrl(ctn_overlap_size,
                             proportion=0,
                             flag=wx.EXPAND,
                             widget_name='noverlap',
                             max=512,
                             initial=128)
        #
        dlg.view.SetSize((230, 260))
        result = dlg.view.ShowModal()
        #
        if result == wx.ID_OK:
            results = dlg.get_results()
            if results.get('spectrogram_type'):
                #
                print('\ndo_STFT:', toc.get_data_object_uid())
                #
                di_uid, di_data = toc.get_last_dimension_index()
                data_index = OM.get(di_uid)

                unit = uom.get_unit(data_index.unit)
                dim = uom.get_unit_dimension(unit.dimension)

                print(unit.dimension, dim, dim.name)
                if dim.name == 'time':
                    print('\nConvertendo {} de {} para {}.'.format(
                        dim.name, data_index.unit, 's'))
                    di_data = uom.convert(di_data, data_index.unit, 's')

                elif dim.name == 'length':
                    print('\nConvertendo {} de {} para {}.'.format(
                        dim.name, data_index.unit, 'm'))
                    di_data = uom.convert(di_data, data_index.unit, 'm')

                else:
                    print('\nNao converteu')
                # new_data = uom.convert(obj.data, obj.unit, new_unit_name)

                #
                start_value = di_data[0]
                step_value = di_data[1] - di_data[0]
                #
                print('start_value: {} - step_value: {}'.format(
                    start_value, step_value))
                #
                dm_data = toc.get_filtered_data()
                #
                #STFT(x, window_size, noverlap, time_start, Ts, mode='psd'):
                #                print('start_value, step_value:', start_value, step_value)

                spec_type = results.get('spectrogram_type')

                stft_data, freq_values, index_values = STFT(
                    dm_data,
                    results.get('window_size'),
                    results.get('noverlap'),
                    start_value,
                    step_value,
                    mode=spec_type)
                #                freq_values *= 1000

                #
                #                print ('\n\nRetornou')
                data_out = np.zeros((len(di_data), len(freq_values)))
                stft_index_step = index_values[1] - index_values[0]
                stft_index_start = index_values[0] - (stft_index_step / 2)
                stft_index_end = index_values[-1] + (stft_index_step / 2)
                #
                #                print('Orig shape:', dm_data.shape)
                #                print('Freq Index Shape:', len(freq_values), len(index_values), stft_data.shape)
                #                print('Freqs:', np.nanmin(freq_values), np.nanmax(freq_values))
                #                print('Indexes:', index_values)
                #
                #                print ('\n\n', stft_index_start, stft_index_end)

                for idx, time in enumerate(di_data):
                    if time >= stft_index_start and time < stft_index_end:
                        stft_index_idx = int(
                            (time - stft_index_start) // stft_index_step)
                        #                        print(idx, time, stft_index_start, stft_index_step, stft_index_idx)

                        data_out[idx] = stft_data[stft_index_idx]

                #print '\n\n'

                data_out = data_out.T

                #                print()
                #                print('data_out.shape:', data_out.shape)
                #                print()

                #
                if spec_type == 'PHASE':
                    spec_type = 'PHASE_UNWRAPPED'
                elif spec_type == 'ANGLE':
                    spec_type = 'PHASE'
                #

                spectogram = OM.new('spectogram',
                                    data_out,
                                    name=toc.get_data_name() + '_STFT',
                                    datatype=results.get('spectrogram_type'))
                if not OM.add(spectogram, toc.get_data_object_uid()):
                    msg = 'Object was not added. tid={\'spectogram\'}'
                    raise Exception(msg)
                #
                freq_index = OM.new('data_index',
                                    freq_values,
                                    name='Frequency',
                                    unit='Hz',
                                    datatype='FREQUENCY')
                if not OM.add(freq_index, spectogram.uid):
                    raise Exception('Frequency Index was not added.')
                #
                spectogram._create_data_index_map([freq_index.uid], [di_uid])
    except Exception as e:
        print('ERROR:', e)
        #pass
    finally:
        UIM.remove(dlg.uid)