产生结束频率为开始频率的 1/2 的声音

信息处理 频率 混叠
2022-02-12 10:06:53

我对信号非常陌生,我正在尝试根据数据库中的一些参数生成声音。因此,数据库存储以下内容:

  • 开始频率
  • 结束频率
  • 起始振幅
  • 结束幅度
  • 期间

我正在使用以下代码根据此信息生成 WAV 文件:

...
double currentFrequency;
double currentAmplitude;

int samplerate = 44100;
int samples = ceil(duration * samplerate);
int* mySampleBuffer = new int[samples];

for(int i=0; i<samples; i++)
{
    currentFrequency = Interpolate(i, 0, samples, startFrequency, endFrequency);
    currentAmplitude = Interpolate(i, 0, samples, startAmplitude, endAmplitude);
    mySampleBuffer[i] = static_cast<int>(INT_MAX * (sin(((double)i * currentFrequency * PI * 2)/(double)samplerate) * (currentAmplitude/maxAmplitude)));
}

writeWAVData("mySound.wav", mySampleBuffer, mySampleBufferSize, samplerate, 1);
delete[] mySampleBuffer;
...

当 currentFrequency 达到 startFrequency 的 1/2 时,我注意到声波翻转(不确定正确的术语是什么)。这似乎不正确。有人可以帮助我了解发生了什么。

这是Audacity的截图大胆

对于此图像,startFrequency 为 3380 Hz,endFrequency = 1380 Hz,持续时间为 0.512 s,幅度从开始到结束是恒定的。我计算出在 0.43264 秒时,currentFrequency 正好是 startFrequency 的 1/2。在图片中,您可以看到“翻转”发生在大约 0.43 秒。

2个回答

在这种情况下,更多地从角速度的角度来考虑频率。如果该速度是恒定的,则通常情况下没有任何变化。但是,如果频率发生变化,将输入到三角函数中的实际角度作为频率函数的反导数来计算更为正确。

这里插值频率是

f(t)=(1tT)f0+tTfT,

所以当时的角度t

ϕ(t)=2π0tf(s)ds=2π[t(1t2T)f0+t22T]=πt[(2tT)f0+tTfT]

相反,您的公式是

ϕo(t)=2πtf(t)=2πt[(1tT)f0+tTfT]

具有导数或局部角速度

ϕo(t)=2π[(12tT)f0+2tTfT]

其中有一个零t=T2f0f0fT,鉴于您的数据位于t=0.43264s.

请注意,正确的公式也达到了零的局部角频率,但在该时间间隔的两倍处,所以在[0,T].


实施注意事项:最后一种形式ϕ(t)可以构造为

 pi*(i*dt)*(f0+interpolate(i,f0,fT,N))

N=samples,dt=T/N前提是

interpolate(0,f0,fT,N)==f0 and interpolate(N,f0,fT,N)==fT 

我认为您在屏幕上重新发现了锯齿。听起来对吗?