Итак, я хочу создать функцию / алгоритм, который берет перетасованный спректрум и возвращает исходную форму спектра.
Исходный спектр файла 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)