14

次のコードは、周波数400Hzの単純な正弦波をモノラルWAVファイルに書き込みます。ステレオWAVファイルを作成するには、このコードをどのように変更する必要がありますか。2番目のチャネルは異なる周波数である必要があります。

import math
import wave
import struct

freq = 440.0
data_size = 40000
fname = "WaveTest.wav"
frate = 11025.0  # framerate as a float
amp = 64000.0     # multiplier for amplitude

sine_list_x = []
for x in range(data_size):
    sine_list_x.append(math.sin(2*math.pi*freq*(x/frate)))

wav_file = wave.open(fname, "w")

nchannels = 1
sampwidth = 2
framerate = int(frate)
nframes = data_size
comptype = "NONE"
compname = "not compressed"

wav_file.setparams((nchannels, sampwidth, framerate, nframes,
    comptype, compname))

for s in sine_list_x:
    # write the audio frames to file
    wav_file.writeframes(struct.pack('h', int(s*amp/2)))

wav_file.close()
4

3 に答える 3

10

sine_list_y他の周波数/チャネルを使用して並列リストを作成し、を設定nchannels=2し、出力ループfor s, t in zip(sine_list_x, sine_list_y):でヘッダー句として使用し、2つのwriteframes呼び出し(1つは、、もうs1つは。)を含む本体を作成しtます。IOW、ファイル内の2つのチャネルに対応するフレームが「交互」になります。

考えられるすべてのWAVファイル形式の詳細については、たとえばこのページを参照してください。引用します。

マルチチャンネルデジタルオーディオサンプルはインターレースウェーブデータとして保存されます。つまり、マルチチャンネル(ステレオやサラウンドなど)のウェーブファイルのオーディオサンプルは、次のサンプルに進む前に各チャンネルのオーディオサンプルを循環して保存されます。時間。これは、ファイル全体を読み取る前にオーディオファイルを再生またはストリーミングできるようにするために行われます。これは、ディスクから大きなファイルを再生する場合(メモリに完全に収まらない場合があります)、またはインターネット経由でファイルをストリーミングする場合に便利です。次の図の値は、[値]列にリストされている順序(上から下)でWaveファイルに保存されます。

次の表は、チャネルのサンプルが左、右、左、右、...

于 2010-09-03T15:47:17.800 に答える
3

.wavステレオファイルの作成例については、test_wave.pyモジュールを参照してください。このテストでは、すべてゼロのファイルが生成されます。交互のサンプル値を挿入して変更できます。

nchannels = 2
sampwidth = 2
framerate = 8000
nframes = 100

# ...

    def test_it(self):
        self.f = wave.open(TESTFN, 'wb')
        self.f.setnchannels(nchannels)
        self.f.setsampwidth(sampwidth)
        self.f.setframerate(framerate)
        self.f.setnframes(nframes)
        output = '\0' * nframes * nchannels * sampwidth
        self.f.writeframes(output)
        self.f.close()
于 2010-09-03T15:56:56.817 に答える
1

もう1つのオプションは、SciPyおよびNumPyライブラリを使用することです。次の例では、左チャネルが低周波数トーンで、右チャネルが高周波数トーンであるステレオウェーブファイルを作成します。

SciPyをインストールするには、 https ://pypi.org/project/scipy/を参照してください。

import numpy as np
from scipy.io import wavfile

# User input
duration=5.0
toneFrequency_left=500 #Hz (20,000 Hz max value)
toneFrequency_right=1200 #Hz (20,000 Hz max value)

# Constants
samplingFrequency=48000

# Generate Tones
time_x=np.arange(0, duration, 1.0/float(samplingFrequency))
toneLeft_y=np.cos(2.0 * np.pi * toneFrequency_left * time_x)
toneRight_y=np.cos(2.0 * np.pi * toneFrequency_right * time_x)

# A 2D array where the left and right tones are contained in their respective rows
tone_y_stereo=np.vstack((toneLeft_y, toneRight_y))

# Reshape 2D array so that the left and right tones are contained in their respective columns
tone_y_stereo=tone_y_stereo.transpose()

# Produce an audio file that contains stereo sound
wavfile.write('stereoAudio.wav', samplingFrequency, tone_y_stereo)

環境に関する注意事項

使用したバージョンPython3.7.1

  • Python 3.7.1
  • SciPy 1.1.0
于 2020-05-18T20:52:25.360 に答える