声学] 第214节 声音的升频"/>
[从头学声学] 第214节 声音的升频
剧情提要:[机器小伟]在[工程师阿伟]的陪同下进行着声学神通的修炼。
这次要研究的是[声音的升频]。
正剧开始:
星历2016年05月13日 13:50:01, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[声音的升频]。
阿伟给小伟做了一个声音升频的工具:
def changeFrequence():import wavename;import wavedata;filename = wavename.wavename;size = len(filename);n = 2;multi = 2**(n/12);print('生成波形开始。>>>'); fout= open('output.txt', 'w');for i in range(size):tmpdata = eval('wavedata.'+filename[i]);retData = [];size_1 = len(tmpdata)//2;sigma = 0;for j in range(size_1):sigma += multi-1;if sigma > 1:sigma -= 1;else:retData.append(tmpdata[2*j]);retData.append(tmpdata[2*j+1]);#由于频率增加而剔除掉的数据removed = len(tmpdata)-len(retData);#用阵列的前端补足缺失for j in range(removed):retData.append(retData[j]);#print(len(retData)); dataStr = filename[i] + ' = [';fout.write(dataStr);size_1 = len(retData);for n in range(size_1):fout.write(str(retData[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_1_0;import vowel_1_1;import vowel_1_2;import vowel_1_3;import vowel_1_4;import vowel_1_5;size = len(filename); sampledata = [];for i in range(size):tmpdata1_0 = eval('vowel_1_0.'+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]);#阴平sampledata += tmpdata1_0*9;sampledata += idleWave*50; #阳平sampledata += tmpdata1_0*2;sampledata += tmpdata1_1*1;sampledata += tmpdata1_2*1;sampledata += tmpdata1_3*1;sampledata += tmpdata1_4*1;sampledata += tmpdata1_5*2;sampledata += idleWave*50;#上声sampledata += tmpdata1_3*2;sampledata += tmpdata1_2*1;sampledata += tmpdata1_1*1;sampledata += tmpdata1_0*1;sampledata += tmpdata1_1*1;sampledata += tmpdata1_2*1;sampledata += tmpdata1_3*1;sampledata += tmpdata1_4*1;sampledata += tmpdata1_5*1;sampledata += idleWave*50;#去声sampledata += tmpdata1_5*2;sampledata += tmpdata1_4*1;sampledata += tmpdata1_3*1;sampledata += tmpdata1_2*1;sampledata += tmpdata1_1*1;sampledata += tmpdata1_0*2;sampledata += idleWave*50;sampledata += idleWave*20;for i in range(size):tmpdata1_0 = eval('vowel_1_0.'+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]);#各元数据组sampledata += tmpdata1_0*5;sampledata += idleWave*50;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 += idleWave*30;return sampledata;
看看是否能够到达目的:
可以看到频率是变高的,虽然处理比较粗粮,但也实用。
让工具更自动化一点:
def changeFrequence():import wavename;import wavedata;filename = wavename.wavename;size = len(filename);for n in range(6):fileStr = 'vowel_1_'+str(n)+'.py';multi = 2**(n/12);print('生成波形开始。>>>'); fout= open(fileStr, 'w');for i in range(size):tmpdata = eval('wavedata.'+filename[i]);retData = [];size_1 = len(tmpdata)//2;sigma = 0;for j in range(size_1):sigma += multi-1;if sigma > 1:sigma -= 1;else:retData.append(tmpdata[2*j]);retData.append(tmpdata[2*j+1]);#由于频率增加而剔除掉的数据removed = len(tmpdata)-len(retData);#用阵列的前端补足缺失for j in range(removed):retData.append(retData[j]);#print(len(retData)); dataStr = filename[i] + ' = [';fout.write(dataStr);size_1 = len(retData);for n in range(size_1):fout.write(str(retData[n]));if (n < size_1-1):fout.write(', ');fout.write('];'); fout.write('\r\n');fout.close();print('生成波形结束,请到'+fileStr+'查收。');if __name__ == '__main__': part = 1;if (part == 3):tmp3_2();elif (part == 2):tmp2_2();elif (part == 1):import wavename;filename = wavename.wavename;tmp_2(11, filename);else:changeFrequence();
现在不管神马声音数据,都能让它有声调了。
这是一些截图,可以看出音调的变化。
下面小伟玩了一回乐音加声调。
乐音由于本身符合十二平均律,所认升一个Key就变成另一个乐音了,
但是再合成后还是可以听出声调的变化的。
点击打开链接--乐音的声调(单音)
上面这段是把每一个乐音的每个声调单独拿来听,其中有很大的间隔。
当然是非常沉闷和冗长的感觉。
于是小伟就把其中的间隔去掉了:
def waveDataChoose_2(filename):import vowel_1_0;import vowel_1_1;import vowel_1_2;import vowel_1_3;import vowel_1_4;import vowel_1_5;size = len(filename); sampledata = [];for i in range(size):tmpdata1_0 = eval('vowel_1_0.'+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]);#阴平sampledata += tmpdata1_0*9;#阳平sampledata += tmpdata1_0*2;sampledata += tmpdata1_1*1;sampledata += tmpdata1_2*1;sampledata += tmpdata1_3*1;sampledata += tmpdata1_4*1;sampledata += tmpdata1_5*2;#上声sampledata += tmpdata1_3*2;sampledata += tmpdata1_2*1;sampledata += tmpdata1_1*1;sampledata += tmpdata1_0*1;sampledata += tmpdata1_1*1;sampledata += tmpdata1_2*1;sampledata += tmpdata1_3*1;sampledata += tmpdata1_4*2;#去声sampledata += tmpdata1_5*2;sampledata += tmpdata1_4*1;sampledata += tmpdata1_3*1;sampledata += tmpdata1_2*1;sampledata += tmpdata1_1*1;sampledata += tmpdata1_0*2;for i in range(size):tmpdata1_0 = eval('vowel_1_0.'+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]);#各元数据组sampledata += tmpdata1_0*5; sampledata += tmpdata1_1*5;sampledata += tmpdata1_2*5;sampledata += tmpdata1_3*5;sampledata += tmpdata1_4*5;sampledata += tmpdata1_5*5;return sampledata;
这下出来的声音真是非常的震撼, 有一种玄幻空灵的味道,
毕竟是把所有乐音符以不同声调在极短的时间内遍历了一遍,
总之很好听。
它的频谱图是这样的,可以看出来很热闹。
点击打开链接--乐音的声调(合成)
本节到此结束,欲知后事如何,请看下回分解。
更多推荐
[从头学声学] 第214节 声音的升频
发布评论