2017-09-20 18 views
0

오랫동안 복잡한주기 사운드를 생성하려고합니다. 주파수를 정확하게 정의하고 싶습니다. 따라서 sampleRate*0.5/tableLen 단계를 사용하고 있습니다. 하지만 큰 웨이브 테이블에는 몇 가지 문제가 있습니다. 소리가 왜곡되어 고주파를 잃습니다.긴주기 웨이브를 사용하여 사용자 정의 오실레이터를 생성하십시오.

여기에는 ~ 440Hz 사인파가있는 최소 예가 나와 있습니다. 나는 길이 8192과 함께 테이블을 사용하면 결과 사인파는 매우 인식 할 수 있습니다 :

https://jsfiddle.net/zxqzntf0/

var gAudioCtx = new AudioContext(); 
var osc = gAudioCtx.createOscillator(); 
var tableSize = 8192; 
var real = new Float32Array(tableSize); 
var imag = new Float32Array(tableSize); 
var freq = 440; 
var step = gAudioCtx.sampleRate*0.5/tableSize; 
real[Math.floor(freq/step)] = 1; 
var wave = gAudioCtx.createPeriodicWave(real, imag, {disableNormalization: true}); 
osc.frequency.value = step; 
osc.setPeriodicWave(wave); 
osc.connect(gAudioCtx.destination); 
osc.start(); 

을하지만 내 테이블 크기를 늘릴 때, 나는 이상한 뭔가를 얻고있다. 결과는 전혀 사인파가 아닙니다!

https://jsfiddle.net/0cc75nnm/

이 문제는 모든 브라우저 (크롬, 파이어 폭스, 가장자리)에서 재현, 그래서 브라우저 버그 될 것 같지 않습니다. 그러나 나는 이것에 관해서 문서에서 아무것도 발견하지 못했다.

추가

나는 오실레이터 주파수는 정수> = 2 Hz의 경우, 나는 테이블 크기 16384와 사운드를 결과에는 어떤 유물이없는 것을 발견 나는 지금 내 요구에 매우 허용 생각 . 하지만 언젠가는 더 오랜 기간을 만들고 싶을 수도 있습니다. 누군가가 스텝이 2Hz보다 작을 때 왜 유물을 얻는 지 설명하면, 나는 그의 대답을 받아 들일 것입니다. https://jsfiddle.net/h9rfzrnL/1/

답변

2

잘못 당신에게 주기적으로 파도를 만드는 :

내가 자바 스크립트로 생성 복잡한 사운드 멜로디의 예입니다. 주기적인 웨이브를위한 배열을 채울 때 샘플 속도를 1로 가정하십시오. 그런 다음 440Hz의 주파수에서 오실레이터를 원하면 오실레이터 주파수를 440Hz로 설정하십시오.

따라서 사인파의 경우 실수 배열은 모두 0이어야하며 허수 배열은 [0, 1]이어야합니다. 실제로 코사인 웨이브를 만들지 만, 그다지 중요하지 않습니다.

+0

범위 400-480 Hz에서 20 개의 사인, 범위 800-960 Hz에서 40 개의 사인 등을 원합니다. 나는 440 Hz 스텝을 가지고 있다면 그것을 할 수 없다. 단일 사인파는 내 문제의 최소한의 예입니다. – gammaker

+0

작성하려는 웨이브의 구체적인 예가 문제를 더 잘 설명하는 데 도움이 될 수 있습니다. 그래도 기본 아이디어는 샘플 속도가 1Hz 인 것처럼 웨이브를 디자인하는 것입니다. 그런 다음 오실레이터의 주파수를 원하는 신호의 기본 주파수로 설정하십시오. –

+0

일부 주파수 범위에서 배전되는 고조파가 필요합니다. 그렇다면 어떻게 주파수 400, 401, ..., 480, 800, 801, ..., 960, 1200, 1201, ..., 1920, ... ... ..., 12800, 12801, ..., 15360? 나는 그것을 할 수 없다. 만약 내가 440 단계를 가지고 있다면, 나는 1Hz의 스텝과 매우 큰 테이블을 필요로한다. 적은 단계가 더 좋습니다. – gammaker