Audio 调频(FM)代码段

Audio 调频(FM)代码段,audio,signal-processing,sound-synthesis,Audio,Signal Processing,Sound Synthesis,我已经为音频信号的频率调制编写了以下代码。音频本身为1秒长,采样频率为8000 Hz。我想通过使用频率为50 Hz(表示为采样频率的一部分)的正弦波将FM应用于此音频信号。调制信号的调制指数为0.25,以便仅产生一对边带 for (i = 0; i < 7999; i++) { phi_delta = 8000 - 8000 * (1 + 0.25 * sin(2* pi * mf * i)); f_phi_accum += phi_delta; //this can ha

我已经为音频信号的频率调制编写了以下代码。音频本身为1秒长,采样频率为8000 Hz。我想通过使用频率为50 Hz(表示为采样频率的一部分)的正弦波将FM应用于此音频信号。调制信号的调制指数为0.25,以便仅产生一对边带

for (i = 0; i < 7999; i++) {
    phi_delta = 8000 - 8000 * (1 + 0.25 * sin(2* pi * mf * i));
    f_phi_accum += phi_delta; //this can have a negative value
    /*keep only the integer part that'll be used as an index into the input array*/
    i_phi_accum = f_phi_accum;   
    /*keep only the fractional part that'll be used to interpolate between samples*/
    r_phi_accum = f_phi_accum - i_phi_accum; 
    //If I'm getting negative values should I convert them to positive
    //r_phi_accum = fabs(f_phi_accum - i_phi_accum);   
    i_phi_accum = abs(i_phi_accum);
    /*since i_phi_accum often exceeds 7999 I have to add this if statement so as to      prevent out of bounds errors   */  
    if (i_phi_accum < 7999)
        output[i] = ((input[i_phi_accum] + input[i_phi_accum + 1])/2) * r_phi_accum;            
}
(i=0;i<7999;i++)的
{
phi_delta=8000-8000*(1+0.25*sin(2*pi*mf*i));
f_phi_acum+=phi_delta;//这可能有一个负值
/*只保留将用作输入数组索引的整数部分*/
i_phi_acum=f_phi_acum;
/*仅保留用于在采样之间插值的小数部分*/
r_phi_acum=f_phi_acum-i_phi_acum;
//如果我得到负值,我应该把它们转换成正值吗
//r_phi_acum=晶圆厂(f_phi_acum-i_phi_acum);
i_phi_acum=abs(i_phi_acum);
/*由于i_phi_acum经常超过7999,我必须添加此if语句以防止越界错误*/
如果(i_phi_累计<7999)
输出[i]=(输入[i_phi_累计]+输入[i_phi_累计+1])/2)*r_phi_累计;
}

您对φ_delta的计算偏离了因子8000和偏移量-它应该是1+/-一个小值,即

phi_delta = 1.0 + 0.25 * sin(2.0 * pi * mf * i));

这将导致phi_delta的范围为0.75到1.25。

好的,但你的问题是什么?这个代码似乎不起作用,我甚至不确定它是否应该起作用。我在另一个线程()中问了这个问题,并尝试实现那里告诉我的内容。好的,谢谢,我将尝试一下并报告结果。还有一个问题。如果我使用,比如,2,而不是0.25作为调制指数,那么我会得到-1到3范围内的phi_delta,所以我可能会得到一些phi_acum的负值(如果phi_delta在循环开始时为负值)。现在我该如何处理这种情况呢?实际上忘记我最后的评论。我先试试看,通常波形表是周期性的,你会将查找表的索引按表的大小处理,即索引应该“环绕”。您的采样音频可能不是周期性的,但您现在仍然可以使用模索引作为第一近似值。我认为现在开始有意义了。如果每次迭代的phi_accum增加相同的量(这不是调制信号的贡献),我们的输出将没有变化,但是当phi_delta的值偏离1时,我们将得到调制信号。当然,非周期性究竟会对结果信号产生怎样的影响还有待观察。感谢您的帮助,为了调试此功能,请尝试使用缓慢变化的信号(例如1 Hz正弦)进行调制-您应该能够在播放过程中听到这种声音,播放速度会先加快,然后再减慢。除此之外,它还可以归结为良好的老式调试,