gpt4 book ai didi

c - 使用Arduino生成黄金码调制的正弦波

转载 作者:行者123 更新时间:2023-11-30 16:13:18 26 4
gpt4 key购买 nike

我正在尝试使用Arduino生成正弦波,黄金代码用于确定波何时会有相移。但是,输出并没有按照我的预期执行。有时,随后的十个周期不会发生任何相移,根据我们对黄金代码阵列的定义,这不应该发生。我可以尝试解决代码的哪一部分问题?

int gold_code[]={1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1, 1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1, -1, 1, 1,1,-1,-1,1,-1,-1,1,1,1};


void loop()
{
int n = sizeof(gold_code)/sizeof(gold_code[0]);
byte bsin[128];
int it;
unsigned long tm0;
unsigned int tm;
for(int i=0;i<128;i++)
{
bsin[i] = 8 + (int)(0.5 + 7.*sin( (double)i*3.14159265/64.));
}
int count=0;
int count1=0;

Serial.println(n);

tm0 = micros();
while(true)
{

tm = micros() - tm0;
if(tm > 511)
{
tm0 = tm0+512;
tm -= 512;
count++;
//Serial.println(gold_code[count%n]);
}
tm = (tm >> 2) ;
if(gold_code[count%n]==0){
PORTB = bsin[tm];
}
else{
PORTB = 16-bsin[tm];
}
}
}

最佳答案

变量count最终会溢出并变为负数。这与模运算结合起来是灾难即将发生的迹象(双关语)。

使用不同的方法将 count 的值限制为 gold_code 数组的范围。

删除模运算后,您应该预计频率会显着增加,因此您可能需要在循环中添加一些节奏。

你的循环节奏是错误的。变量 count 的增量速度是相位计数器的 4 倍。

此外,@Edward Karak 提出了一个有效的观点。要进行适当的相移,您应该添加(或减去)tm,而不是 sin 值。

[编辑]我对相移的处理方式不太满意。以与相位计数器相同的速度推进黄金计数器感觉不太正确。所以我为此添加了一个单独的计时器。目前 gold_code 数组每 8 微秒更新一次,但您可以将其更改为您应该拥有的任何内容。

如:

unsigned char tm0 = 0;
unsigned char tm0_gold = 0;

const unsigned char N = sizeof(gold_code) / sizeof(gold_code[0]);
unsigned char phase = 0;

for(;;)
{
// pacing for a stable frequency
unsigned char mic = micros() & 0xFF;
if (mic - tm0_gold >= 8)
{
tm0_gold = mic;

// compute and do the phase shift
if (++count >= N)
count -= N;

if (gold_code[count] > 0) // you have == 0 in your code, but that doesn't make sense.
phase += 16; // I can't make any sense of what you are trying to do,
// so I'll just add 45° of phase for each positive value
// you'll probably want to make your own test here
}

if (mic - tm0 >= 4)
{
tm0 = mic;

// advance the phase. keep within the LUT bounds
if (++phase >= 128)
phase -= 128;

// output
PORTB = bsin[phase];
}
}

为了频率稳定性,您需要在调试后将正弦发生器移至定时器中断。这将释放你的loop()来进行一些额外的控制。

我不太明白为什么count 的增量与相位计数器的增量一样快。您可能希望以较慢的速度增加count以达到您的目标。

关于c - 使用Arduino生成黄金码调制的正弦波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58066495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com