改组后重新排列信号频谱

时间:2019-01-02 15:44:59

标签: signals signal-processing spectrum

所以我想创建一个函数/算法,该函数/算法采用经过改组的频谱并返回频谱的原始形式。

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)

0 个答案:

没有答案