我目前正在上学,我必须用C / C ++编写FIR / IIR过滤器。
作为滤波器的输入,使用具有白噪声的2kHz正弦波。然后,通过将正弦波输入到C / C ++代码,我需要观察干净的正弦波输出。这一切都是在软件层面完成的。
我的问题是我不知道如何处理正弦波的输入/输出。例如,我不知道我可以使用或需要使用哪种类型的文件格式,我不知道如何制作正弦波形式等。
这可能是一个非常微不足道的问题,但我不知道从哪里开始。
有没有人对此类问题有任何经验或有任何提示?
任何帮助都会非常感激。
答案 0 :(得分:2)
生成2kHz的正弦波意味着您希望随着时间的推移生成值,当绘制图形时,遵循正弦波。选择幅度(你没有提到一个),并选择你的采样率。请参见此处的图表(http://en.wikipedia.org/wiki/Sine_wave);你想要的值是在绘制时遵循以2D绘制的正弦波,X轴为时间,Y轴是您正在测量的值的振幅。
假设您生成的文件具有时间值和幅度测量值,您可能希望将其缩放到幅度(稍后会详细介绍)。因此,器件可能会提供8位或16位数字读数,表示针对某种规模的绝对或对数测量。
struct sample
{
long usec; //microseconds (1/1,000,000 second)
short value; //many devices give a value between 0 and 255
}
假设您每秒生成2000个样本。如果你实际测量的是外部值,那么每次都会得到相同的值(见图?),当绘制时看起来像一条直线。
所以你想要一个高于频率的采样率。假设您采样频率为2倍。然后你会在正弦波上看到180度的关闭,这可能是峰值,上升或下降的斜率,或正弦波过零的地方。频率4倍的采样率将显示锯齿图案。随着样本数量的增加,图形看起来更接近实际的正弦波。这类似于您在8位游戏精灵中看到的像素化。
您认为任何给定正弦波的样本数量会给您一个正弦波的近似值吗? 8? 16? 100? 500?假设您每秒采样1,000,000次,那么每个正弦波就会有1,000,000 / 2,000 = 500个样本。
以下是生成一些样本的代码,
#define MAXJITTER (10)
#define MAXNOISE (20)
int
generate_samples( long duration, //duration in microseconds
int amplitude, //scaled peak measurement from device
int frequency, //Hz > 0
int samplerate ) //how many samples/second > 0
{
long ts; //timestamp in microseconds, usec
long sdelay; //sample delay in usec
if(frequency<1) frequency1=1; //avoid division by zero
if(samplerate<1) samplerate=1; //avoid division by zero
sdelay = 1000000/samplerate; //usec delay between each sample
sample m;
int jitter, noise; //introduce noise here
for( long ts=0; ts<duration; ts+=sdelay ) // //in usec (microseconds)
{
//jitter, sample not exactly sdelay
jitter = drand48()*MAXJITTER - (MAXJITTER/2); // +/-1/2 MAXJITTER
//noise is mismeasurement
noise = drand48()*MAXNOISE - (MAXNOISE/2); // +/-1/2 MAXNOISE
m.usec = ts + jitter;
//2PI in a full sine wave
float period = 2*PI * (ts*1.0/frequency);
m.value = sin( period );
//write m to file or save me to array/vector
}
return 0; //return number of samples, or sample array, etc
}
首先生成一些样本,
generate_samples( 5*1000000, 100, 2000, 2000*50 );
您可以将生成的样本绘制为噪声信号的视图。
以上肯定会回答您关于如何记录测量结果的许多问题,以及通常使用的格式。它显示了如何在多个正弦波周期内传输,生成具有抖动和噪声的随机样本,并在一段时间内记录样本。
构建过滤器是第二个问题。编写代码来模拟下面描述的过滤器会留下一个练习,或者第二个问题,因为你会收集到更多的理解,
生成的信号样本(上图)将被输入您编写的代码以构建过滤器。期望滤波器的输出可能是一组新的样本,可能带有抖动,但预计滤波器会消除至少一些噪声。然后,您就可以绘制过滤器生成的样本。
您可能会考虑将示例转换为逗号分隔文件,这样您就可以将它们加载到Excel中并对其进行图形化。如果你阐明了你的电子背景,你的知识,以及你对过滤器的了解程度等,它可能会有所帮助。
祝你好运!