[从头学声学] 第213节 声调的频谱

剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进行着声学神通的修炼。
这次要研究的是[声调的频谱]。

正剧开始:

星历2016年05月13日 10:25:06, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[声调的频谱]。


[从头学声学] 第213节 声调的频谱_第1张图片


[从头学声学] 第213节 声调的频谱_第2张图片

元音的数据:


生成代码:

#生成声音样本,返回样本矩阵
def sampleGen_2(N, freq1, freq2, freq3):
    #设立20000个数值点,约可听2秒
    sampleArray = [];

    coef = 2*math.pi/11025;

    #音色调节
    weight = [1.53, 1, 0.87];
    totalWeight = 0;

    if (freq2 <= 0):
        totalWeight = weight[0];
    elif (freq3 <= 0):
        totalWeight = weight[0] + weight[1];
    else:
        totalWeight = sum(weight);

    multi = 1.06**6;
   
    for i in range(N):
        xcoef_1 = coef*i*freq1*multi;
        xcoef_2 = coef*i*freq2*multi;
        xcoef_3 = coef*i*freq3*multi;
        
        yvalue = 0;

        if (freq2 <= 0):
            yvalue = (weight[0]*math.sin(xcoef_1))/totalWeight;
        elif (freq3 <= 0):
            yvalue = (weight[0]*math.sin(xcoef_1)+ weight[1]*math.sin(xcoef_2))/totalWeight;
        else:
            yvalue = (weight[0]*math.sin(xcoef_1)+ weight[1]*math.sin(xcoef_2) + weight[2]*math.sin(xcoef_3))/totalWeight;
        
        if (yvalue < 0):
            yvalue *= 32768;
        else:
            yvalue *= 32767;
        sampleArray.append(round(yvalue));
    return sampleArray;
	

#生成声波数据
def tmp2_2():
    print('生成波形开始。>>>');
    
    fout= open('output.txt', 'w');

    #普通话元音,浊辅音
    frequence = [[1000,1400,2400], #a
                 [1100,1550,2600], #a(女)
                 [600,1000,2000],  #o
                 [900,1300,3000],  #o(女)
                 [600,1400,2400],  #e
                 [700,1450,3200],  #e(女)
                 [650,2050,2600],  #e^
                 [550,2400,3000],  #e^(女)
                 [400,2300,3500],  #i
                 [350,2900,3500],  #i(女)
                 [400, 700],       #u
                 [350, 650],       #u(女)
                 [450, 2200, 2500],#yu
                 [350, 2300, 2750],#yu(女)
                 [500, 1500, 2600],#i(兹)
                 [500,1500,3100],  #i(兹)(女)
                 [450, 1700, 2400],#i(知)
                 [450, 1900, 2600],#i(知)(女)
                 [600, 1500, 2000],#er
                 [750, 1750, 3600],#er(女)
                 #普通话浊辅音
                 [550, 1800, 2650], #r
                 [300, 1200, 2350], #m
                 [400, 1500, 2400], #n
                 [380, 1000, 1800], #-n
                 [400, 1000, 1900], #-ng
                 [350, 1500, 2400], #l
                 [300, 2200, 3500], #y(i)
                 [300, 600], #w(u)
                 [350, 2400, 3600] #yu
                 ];
    
        
    size = len(frequence);
    
    
    for i in range(size):
        dataStr = '';
        size_1 = len(frequence[i]);
           
        if (size_1 == 2):
            dataStr = 'primaryTone_'+ str(frequence[i][0])+'_'+str(frequence[i][1]) + ' = [';
        elif (size_1 == 3):
            dataStr = 'primaryTone_'+ str(frequence[i][0])+'_'+str(frequence[i][1]) +'_'+str(frequence[i][2])+ ' = [';
                                                               
        fout.write(dataStr);

        data = [];

        if (size_1 == 2):
            data = waveDataGen_2(frequence[i][0], frequence[i][1], 0);
        elif (size_1 == 3):
            data = waveDataGen_2(frequence[i][0], frequence[i][1], frequence[i][2]);
              
        size_1 = len(data);

        for n in range(size_1):
            fout.write(str(data[n]));
            if (n < size_1-1):
                fout.write(', ');

        fout.write('];');
            
        fout.write('\r\n');

    fout.close();
    print('生成波形结束,请到output.txt查收。');


声调的比较:

def waveDataChoose_2(filename):
    import vowel_0;
    import vowel_1;
    import vowel_1_1;
    import vowel_1_2;
    import vowel_1_3;
    import vowel_1_4;
    import vowel_1_5;
    import vowel_1_6;

    size = len(filename);    

    sampledata = [];

 
    for i in range(size):
        tmpdata1 = eval('vowel_1.'+filename[i]);
        tmpdata1_1 = eval('vowel_1_1.'+filename[i]);
        tmpdata1_2 = eval('vowel_1_2.'+filename[i]);
        tmpdata1_3 = eval('vowel_1_3.'+filename[i]);
        tmpdata1_4 = eval('vowel_1_4.'+filename[i]);
        tmpdata1_5 = eval('vowel_1_5.'+filename[i]);
        tmpdata1_6 = eval('vowel_1_6.'+filename[i]);
        

        #阴平
        sampledata += tmpdata1*9;
        sampledata += idleWave*50; 

        #阳平
        sampledata += tmpdata1;
        sampledata += tmpdata1_1*2;
        sampledata += tmpdata1_2*1;
        sampledata += tmpdata1_3*1;
        sampledata += tmpdata1_4*1;
        sampledata += tmpdata1_5*1;
        sampledata += tmpdata1_6*2;
        sampledata += idleWave*50;

        #上声
        sampledata += tmpdata1_4*2;
        sampledata += tmpdata1_3*1;
        sampledata += tmpdata1_2*1;
        sampledata += tmpdata1_1*1;
        sampledata += tmpdata1;
        sampledata += tmpdata1_1*1;
        sampledata += tmpdata1_2*1;
        sampledata += tmpdata1_3*1;
        sampledata += tmpdata1_4*1;
        sampledata += tmpdata1_5*1;
        sampledata += tmpdata1_6*2;
        sampledata += idleWave*50;

        #去声
        sampledata += tmpdata1_6*2;
        sampledata += tmpdata1_5*1;
        sampledata += tmpdata1_4*1;
        sampledata += tmpdata1_3*1;
        sampledata += tmpdata1_2*1;
        sampledata += tmpdata1_1*1;
        sampledata += tmpdata1*2;
        sampledata += idleWave*50;

        sampledata += idleWave*20;

    for i in range(size):
        tmpdata1 = eval('vowel_1.'+filename[i]);
        tmpdata1_1 = eval('vowel_1_1.'+filename[i]);
        tmpdata1_2 = eval('vowel_1_2.'+filename[i]);
        tmpdata1_3 = eval('vowel_1_3.'+filename[i]);
        tmpdata1_4 = eval('vowel_1_4.'+filename[i]);
        tmpdata1_5 = eval('vowel_1_5.'+filename[i]);
        tmpdata1_6 = eval('vowel_1_6.'+filename[i]);
        
        #各元数据组
        sampledata += tmpdata1_1*5;
        sampledata += idleWave*50;

        sampledata += tmpdata1_2*5;
        sampledata += idleWave*50;

        sampledata += tmpdata1_3*5;
        sampledata += idleWave*50;

        sampledata += tmpdata1_4*5;
        sampledata += idleWave*50;

        sampledata += tmpdata1_5*5;
        sampledata += idleWave*50;

        sampledata += tmpdata1_6*5;
        sampledata += idleWave*50; 

        sampledata += idleWave*20;
        
    return sampledata;
	

元音与音调:

点击打开链接--元音与音调


四种声调[阴平、阳平、上声、去声]的频谱:

[从头学声学] 第213节 声调的频谱_第3张图片


[从头学声学] 第213节 声调的频谱_第4张图片




同一种元音的频率由低到高:



本节到此结束,欲知后事如何,请看下回分解。

你可能感兴趣的:([从头学声学] 第213节 声调的频谱)