我正在尝试使用Qt(c ++)创建一个程序,它可以使用QAudioinput和QIODevice从我的麦克风录制音频。 现在,我想要想象我的信号
任何帮助将不胜感激。感谢
[Edit1] - 从您的评论中复制(由Spektre撰写)
这就是我如何分离值
for ( int i = 0, j = 0; i < countSamples ; ++j)
{
YVectorRight[j]=Samples[i++];
YVectorLeft[j] =Samples[i++];
}
。我不知道如何只触发一个频道
答案 0 :(得分:1)
<强>时基强>
fsmpl
是输入信号采样频率[Hz] 尝试使用尽可能大的(44100,48000, ???)
,以便检测到的最大频率为fsmpl/2
,这会为您提供时基轴的顶部。下限由缓冲区长度
<强>绘制强>
使用以下命令创建将从指定的起始地址(内部缓冲区)渲染采样缓冲区的函数:
这可以通过修改起始地址或仅通过X偏移曲线
<强>等级强>
创建将模拟级别功能的功能。因此从起始地址搜索缓冲区,如果幅度跨越等级则停止。您可以拥有更多模式,但这些是您应该实现的基础:
( < lvl ) -> ( > lvl )
( > lvl ) -> ( < lvl )
还有许多其他可能性,如毛刺,相对边缘,......
预览强>
你可以将所有这些放在一起,例如:你有start address
变量,所以连续地在一些缓冲区中和在level
的定时器调用start address
上采样数据(并更新它)。然后使用新的start address
调用draw并将timebase period
添加到start address
(当然是根据您的样本)
<强>多信道强>
我使用 Line IN,所以我有立体声输入(A,B =左,右)因此我可以添加一些其他的东西,如:
A,B
,无)x
轴是A
,y
轴是B
这创造了着名的Chebyshev图像,这些图像对于依赖的正弦信号是有益的。通常形成圆形,椭圆形,扭曲的循环...... 错误投放
您可以为模拟电容或输入接地的通道添加滤波器等等
<强> GUI 强>
你需要很多设置我更喜欢模拟旋钮而不是按钮/滚动条/滑块,就像真正的示波器一样
以下是我的示波器的一些截图:
以下是我的生成器的屏幕截图:
最后在添加一些FFT之后还有频谱分析仪
<强> PS。强>
顺便说一下。我将这三个应用程序作为可链接的C ++子窗口类(Borland)
希望如果您需要任何帮助,只需评论我
,这会有所帮助[Edit1]触发器
您一次触发所有通道但通常仅从一个检查触发条件现在实现很简单,例如让触发条件为 A(左)通道上升到高于水平所以:
首先进行连续播放,没有你写的触发器是这样的:
for ( int i = 0, j = 0; i < countSamples ; ++j)
{
YVectorRight[j]=Samples[i++];
YVectorLeft[j] =Samples[i++];
}
// here draw or FFT,draw buffers YVectorRight,YVectorLeft
添加触发器
要添加触发条件,您只需找到符合它的样本并开始绘制它,以便将其更改为此类
// static or global variables
static int i0=0; // actual start for drawing
static bool _copy_data=true; // flag that new samples need to be copied
static int level=35; // trigger level value datatype should be the same as your samples...
int i,j;
for (;;)
{
// copy new samples to buffer if needed
if (_copy_data)
for (_copy_data=false,i=0,j=0;i<countSamples;++j)
{
YVectorRight[j]=Samples[i++];
YVectorLeft[j] =Samples[i++];
}
// now search for new start
for (i=i0+1;i<countSamples>>1;i++)
if (YVectorLeft[i-1]<level) // lower then level before i
if (YVectorLeft[i]>=level) // higher then level after i
{
i0=i;
break;
}
if (i0>=(countSamples>>1)-view_samples) { i0=0; _copy_data=true; continue; }
break;
}
// here draw or FFT,draw buffers YVectorRight,YVectorLeft from i0 position
view_samples
是查看/处理的数据大小(对于一个或多个屏幕),它应该比(countSamples>>1)