2017-12-31 124 views
2

주어진 기간 동안 주어진 주파수의 사인파를 생성하고 .wav 파일에 쓰려고합니다. numpy의 sin 함수와 scipy의 wavfile 함수를 사용하고 있습니다. 확실히 사인파가 아닌 이상한 소리가납니다.파이썬을 사용하여 사인파를 생성하려면 어떻게해야합니까?

import numpy as np 
from scipy.io import wavfile 

fs = 44100 

f = int(raw_input("Enter fundamental frequency: ")) 
t = float(raw_input("Enter duration of signal (in seconds): ")) 

samples = np.arange(t * fs) 

signal = np.sin(2 * np.pi * f * samples) 

signal *= 32767 

signal = np.int16(signal) 

wavfile.write(str(raw_input("Name your audio: ")), fs, signal) 

어떤 도움을 주시면 감사하겠습니다. 사인파 또는 근본적으로 근본적으로 잘못된 가정을 한 적이 있습니까?

+1

'samples = np.arange (t * fs)/fs'를 실행하면 어떻게됩니까? –

답변

2

변경

samples = np.arange(t * fs) 

samples = np.linspace(0, t, int(fs*t), endpoint=False) 

에 (이 가정하는 정수 값 fs*t 결과.)

또는 폴 기갑 코멘트에서 알 수 있듯이,

samples = np.arange(t * fs)/fs 

samples은 정수 0, 1, 2, ... fs*t의 순서입니다. 대신 샘플의 실제 시간 값 (초)이 필요합니다.

+0

필자는 광산이 좀 더 정확하다고 생각합니다 ('fs * t '가 정수가 아닐 경우). –

+0

그래, 이제 이해하겠다! 샘플 변수는 샘플이 아닌 초 단위이어야합니다. 고맙습니다! –

0

샘플 값과 길이를 혼합합니다! 시도 :

samples = np.linspace(0, t, t * fs) 

또 다른 세부 사항 : 당신이 strraw_input 주위가 필요하지 않습니다.

관련 문제