Переставить спектр сигнала после тасования - PullRequest
0 голосов
/ 02 января 2019

Итак, я хочу создать функцию / алгоритм, который берет перетасованный спректрум и возвращает исходную форму спектра.

Исходный спектр файла wav такой: исходный спектр

После этого я разрезал спектр на 4 части и перетасовал их, затем создал новую форму волны с этими значениями и затем спектром, это выглядит так: sprectum после перетасовки

Таким образом, основываясь на спектре тасования, мне нужно получить исходный спектр.Скорее всего, мне нужно разделить спектр в случайном порядке ... скажем, 4 части и использовать грубую силу для проверки каждой комбинации.

Но это мой вопрос, когда я сравниваю 2 части спектра, как мнезнаете, кто должен быть первым, а кто вторым?

Это мой класс Wave и Spectrum:

class Wave:

def __init__(self,data,ts=None,framerate=None):

    # data:wave data values
    # ts:array of time where the signal was evaluated/sampled


    self.data=data
    self.framerate=framerate

    if ts is None:
        self.ts =np.arange(len(data))/self.framerate
    else:
        self.ts=ts

def __len__(self):
    return len(self.data)


@property
def duration(self):

    return len(self.data) / self.framerate

def make_spectrum(self):

    n=len(self.data)
    d=1/self.framerate

    ampArray = np.fft.rfft(self.data)
    freqArray = np.fft.rfftfreq(n, d) 

    return Spectrum(ampArray,freqArray,self.framerate)

def plot(self):

    plt.plot(self.ts,self.data)  

class Spectrum:

def __init__(self,ampArray,freqArray,framerate):

    self.ampArray=ampArray
    self.freqArray=freqArray
    self.framerate=framerate


def plot(self):

    plt.plot(self.freqArray,np.absolute(self.ampArray))

def make_wave(self,dataLength):

    data=np.fft.irfft(self.ampArray,dataLength);
    return Wave(data,framerate=self.framerate)

def shuffle(self):

    listZip=list(zip(self.ampArray,self.freqArray))   # list of tuples ( amplitude value,frequency value)
    listToShuffle=list(chunks(listZip,4))        # split the list in 4 list
    random.shuffle(listToShuffle)                # randomize the 4 lists
    flat_list = [item for sublist in listToShuffle for item in sublist]  
    random_ampArray,random_freqArray= zip(*flat_list)
    return Spectrum(random_ampArray,random_freqArray,self.framerate)
...