所以我想创建一个函数/算法,该函数/算法采用经过改组的频谱并返回频谱的原始形式。
wav文件的初始频谱是这样的: original spectrum
在此之后,我将频谱分为四个部分,并对其进行混洗,然后使用这些值和频谱创建一个新的波形,如下所示: sprectum after shuffle
因此,基于混洗频谱,我需要获取原始频谱。我最有可能不得不将随机频谱分解为...让我们说4个部分,并使用蛮力检查每个组合。
但这是我的问题,当我比较频谱的两个部分时,我怎么知道哪个应该是第一个,哪个应该是第二个?
这是我的Wave and 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)