如何使用端口音频实时更改端口

如何使用端口音频实时更改端口

问题描述:

中的参数,我想更改参数实时。如何使用端口音频实时更改端口

赞(与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

下面是一个简化的切Ñ糊,其在每次调用 增大/减小频率 - 声音几分像 重复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; 
} 

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 π周期中。这通常是为了提高效率。