改善两个波形文件的连接?

时间:2010-06-16 06:35:49

标签: python wav

我已经编写了一个用于连接两个wave文件的代码。当我加入更大的片段时工作正常但是因为我需要加入非常小的片段,所以清晰度不高。

据我所知,窗口连接等信号处理技术可以用来改善文件的连接。

y [n] = w [n] s [n] 将样本数n处的信号值乘以窗口函数的值 汉明窗w [n] = .54 - .46 * cos(2 * Pi * n)/ L 0

我不明白如何获取样本n的信号值以及如何实现这个?

the code i am using for joining is

import wave
m=['C:/begpython/S0001_0002.wav', 'C:/begpython/S0001_0001.wav']
i=1
a=m[i]
infiles = [a, "C:/begpython/S0001_0002.wav", a]
outfile = "C:/begpython/S0001_00367.wav"

data= []
data1=[]
for infile in infiles:
    w = wave.open(infile, 'rb')
    data1=[w.getnframes]
    data.append( [w.getparams(), w.readframes(w.getnframes())] )
    #data1 = [ord(character) for character in data1]

    #print data1
    #data1 = ''.join(chr(character) for character in data1)

    w.close()

output = wave.open(outfile, 'wb')
output.setparams(data[0][0])
output.writeframes(data[0][1])
output.writeframes(data[1][1])
output.writeframes(data[2][1])
output.close()

在加入过程中,我正在使用字节格式来处理frame.now必须使用整数或浮点格式对它们执行操作我猜,如果我的想法是真的,我该怎么做?

2 个答案:

答案 0 :(得分:0)

这可能不是最好的解决方案,但我相信它会起作用。也许你找到现有的libs或者一些步骤,我不知道Python。我建议的步骤是:

  1. 加载wave文件。
  2. 创建样本值(幅度) 每帧(取决于帧 尺寸,litte / big endian, 符号/无符号)。
  3. 除以生成的int数组 值到窗口,例如样品 0-511,512-1023,......
  4. 执行窗口功能 你想加入的窗户。
  5. 加入吧。
  6. 将窗口存回一个字节 数组,反向运算 第一步。
  7. 旧帖子: 你必须计算样本值,在java中,2字节/帧声音文件的函数如下所示:

    public static int createIntFrom16( byte _8Bit1, byte _8Bit2 ) {
        return ( 8Bit1<<8 ) | ( 8Bit2 &0x00FF );
    }
    

    通常你必须关心文件是否使用little endian,我不知道Python lib是否会考虑到这一点。

    创建完所有样本值后,您必须将文件划分为窗口,例如大小为512个样本。然后,您可以窗口化值,并创建字节值。对于16位,它看起来像这样:

    public static byte[] createBytesFromInt(int i) {
        byte[] bytes = new byte[2];
        bytes[0]=(byte)(i>>8);
        bytes[1]=(byte)i;
        return bytes;
    }
    

答案 1 :(得分:0)

为了让您高度理解,WAV音频格式由一个44字节的标题组成,您可以在其中定义必要的元数据,如采样率,通道数等,然后是实际音频数据所在的有效负载。音频只是随时间变化的幅度变化曲线。 WAV格式允许该幅度从最大值+1.0变化到最小值-1.0,表示为浮点。在进行音频记录时,通常每秒测量44100次(采样率)。因此,WAV文件只存储这一系列样本值。 WAV格式不存储浮点,而是存储+1到-1的范围,作为0到2 ^ 16之间的整数。这些16位样本每个样本需要两个字节的文件存储空间。在如上所述的示例代码中,i>&gt; 8将音频值移位8位。如果您考虑这些想法,并编写自己的WAV格式代码来读取或写入文件,您将能够很好地回答您的问题。