2014-09-25 117 views
1

中的參數,我想更改參數實時。如何使用端口音頻實時更改端口

贊(與C): 正弦波440Hz的 - >我輸入 '500' 與的getchar() - >正弦波500HZ

但我不能找到方法。

有誰知道不錯的決議?

我的目標:這個代碼(http://goo.gl/UJJlTw)+的getchar()(改變頻率從CUI /終端)

+0

您是否在生成可變頻率音調或者在不停止音頻生成的情況下從用戶那裏獲取輸入時遇到問題? – SleuthEye 2014-09-25 01:41:12

+0

感謝評論。它的'generatind一個可變頻率的音調'。 (Like-> http://www.portaudio.com/docs/v19-doxydocs/paex__sine_8c_source.html) – ya90net 2014-09-25 02:09:29

回答

0

下面是一個簡化的切Ñ糊,其在每次調用 增大/減小頻率 - 聲音幾分像 重複zureee zuraaaa,zureee zuraaa ...

var phi = 0, 
    dphi = 2.0 * Math.PI * given_node.sample_freq/
    given_node.sample_rate; 

for (var curr_sample = 0; curr_sample < given_node.BUFF_SIZE; curr_sample++, phi += dphi) { 

    synthesized_output_buffer[curr_sample] = Math.sin(phi); 
} 

given_node.sample_freq *= given_node.freq_factor; 

if (given_node.sample_freq < 
    given_node.MIN_FREQ) { 

    given_node.freq_factor = given_node.increasing_freq_factor; 

} else if (given_node.sample_freq > given_node.MAX_FREQ) { 

    given_node.freq_factor = given_node.decreasing_freq_factor; 
} 
0

This other example from portaudio documentation顯示瞭如何使用synchronous write I/O method以生成正弦波。

下面是從該實施例的簡化片斷,其中跳過portaudio初始化呼叫,併產生一個單一的信道,集中於主信號生成機制:

/* initialization */ 
int phase = 0; 
int phase_increment = (int) (frequency * TABLE_SIZE/((double) SAMPLING_RATE) + 0.5); 
... 
/* signal generation loop */ 
for (;;) 
{ 
    ... 
    for(j=0; j < FRAMES_PER_BUFFER; j++) 
    { 
    buffer[j][0] = sine[phase]; 
    phase += phase_increment; 
    if(phase_increment >= TABLE_SIZE) left_phase -= TABLE_SIZE; 
    } 
    err = Pa_WriteStream(stream, buffer, FRAMES_PER_BUFFER); 
} 

生成具有改變在實際的頻率的正弦波時間在概念上與以固定頻率產生正弦波沒有區別。主要區別在於您需要更新phase_increment以匹配新的所需頻率。所以,一旦你已經從用戶界面看new_frequency,你會重新計算phase_increment,並準備產生下一個樣本:

/* signal generation loop */ 
for (;;) 
{ 
    ... 
    for(j=0; j < FRAMES_PER_BUFFER; j++) 
    { 
    buffer[j][0] = sine[phase]; 
    phase += phase_increment; 
    if(phase_increment >= TABLE_SIZE) left_phase -= TABLE_SIZE; 
    } 
    err = Pa_WriteStream(stream, buffer, FRAMES_PER_BUFFER); 

    /* now update phase_increment as per new frequency */ 
    phase_increment = (int) (new_frequency * TABLE_SIZE/((double) SAMPLING_RATE) + 0.5); 
    /* then next loop iteration will be generating a sine wave at the new frequency */ 
} 

注意,正弦波產生使用查表,其中sine是包含預先計算表sin函數的值在完整的2 π週期中。這通常是爲了提高效率。