- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 mbed LPC 微 Controller 给吉他调音。下面是项目示例的链接。 https://developer.mbed.org/users/adurand/notebook/guitar-tuner/
但是,我遇到了一些问题。首先,我使用任意波形发生器以每根弦所需的频率模拟吉他输入。放大器电路的构造相同。我还更改了代码以使用 Mbed LCD 而不是诺基亚。我使用示波器来验证进入 Mbed 的 AnalogueIn p20 的输出是否被放大并处于正确的频率。这是我遇到问题的地方。
这是代码(感谢 Andrew Durand):
#include "mbed.h"
#include "adc.h"
#include "C12832.h"
#include <math.h>
#define PI 3.1415
#define SAMPLE_RATE 24000
InterruptIn button1(p12);
C12832 lcd(p5, p7, p6, p8, p11);
DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
//LCD and Other Random Variables
int string_select = 0;
float high, high1, in_tune, in_tune1, in_tune2, in_tune3,
low, low1, note, low_mod, high_mod;
char* key;
int Counter = 0;
int Buffer[6000];
float goertzelFilter(int samples[], float freq, int N) {
float s_prev = 0.0;
float s_prev2 = 0.0;
float coeff,normalizedfreq,power,s;
int i;
normalizedfreq = freq / SAMPLE_RATE;
coeff = 2*cos(2*PI*normalizedfreq);
for (i=0; i<N; i++) {
s = samples[i] + coeff * s_prev - s_prev2;
s_prev2 = s_prev;
s_prev = s;
}
power = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2;
return power;
}
ADC adc(SAMPLE_RATE, 1);
void sample_audio(int chan, uint32_t value) {
Buffer[Counter] = adc.read(p20);
Counter += 1;
}
void button1_pressed() {
string_select++;
if (string_select > 5) string_select = 0;
}
int main() {
//Interupt for Switching Strings
button1.mode(PullDown);
button1.rise(&button1_pressed);
while (1) {
switch (string_select) {
case 0:
note = 82;
key= "E2";
break;
case 1:
note = 110;
key= "A2";
break;
case 2:
note = 147;
key= "D3";
break;
case 3:
note = 196;
key= "G3";
break;
case 4:
note = 247;
key= "B3";
break;
case 5:
note = 330;
key= "E4";
break;
}
//Prepare for burst mode on all ADC pins and set up interrupt handler (using ADC library from Simon Blandford
adc.append(sample_audio);
adc.startmode(0,0);
adc.burst(1);
adc.setup(p20,1);
//start the interrupt and wait for about 4096 samples
adc.interrupt_state(p20,1);
wait(.2);
//Finsh up - Unset pin 20
adc.interrupt_state(p20,0);
adc.setup(p20,0);
int actual_rate = adc.actual_sample_rate();
//for debugging tell the terminal sample rate and how many samples we took
printf("Requested max sample rate is %u, actual max sample rate is %u.\n",
SAMPLE_RATE, actual_rate);
printf("We did %i samples\n",Counter);
high = 0;
low = 0;
for (int i=3; i<46; i+=3) {
high1 = goertzelFilter(Buffer, (note + i ), Counter);
if (high1 > high) high=high1;
}
for (int i=3; i<46; i+=3) {
low1 = goertzelFilter(Buffer, (note - i ), Counter);
if (low1 > low) low=low1;
}
in_tune1 = goertzelFilter(Buffer, (note+1), Counter);
in_tune2 = goertzelFilter(Buffer, note, Counter);
in_tune3 = goertzelFilter(Buffer, (note-1), Counter);
if ((in_tune1 > in_tune2) && (in_tune1 > in_tune3)) in_tune = in_tune1;
else if ((in_tune2 > in_tune1) && (in_tune2 > in_tune3)) in_tune = in_tune2;
else in_tune = in_tune3;
printf("high = %.2f, low = %.2f, in_tune = %.2f", high, low, in_tune);
high_mod = high/in_tune;
low_mod = low/in_tune;
if ((high_mod > .8)&&(low_mod > .8)) {
myled1 = 0;
myled2 = 0;
myled3 = 0;
}
if ((high_mod < .8)&&(low_mod > .8)) {
myled1 = 0;
myled2 = 0;
myled3 = 0;
}
if ((high > in_tune) && (low < in_tune)) { //Guitar string is at correct frequency
myled1 = 0;
myled2 = 1;
myled3 = 0;
} else if (high > in_tune) { // String is higher than the desired frequency
myled1 = 1;
myled2 = 0;
myled3 = 0;
} else if (low < in_tune){ // String is below that of the desired frequency
myled1 = 0;
myled2 = 0;
myled3 = 1;
} else { // Else no input, display squiggles
myled1 = 0;
myled2 = 0;
myled3 = 0;
}
// Display on the LCD
lcd.cls();
lcd.locate(0,0);
lcd.printf("Tuning String: %i", (6-string_select));
lcd.locate(0,11);
lcd.printf("%s at %i Hz",key, (int) note);
lcd.locate(0,23);
if (myled2) lcd.printf("In Tune!"); // if myled2 is on, guitar is in tune
else if (myled3) lcd.printf("Too Low "); // if myled3 is on, guitar is lower than desired tone
else if (myled1) lcd.printf("Too High"); // if myled1 is on, guitar is higher than desired tone
else lcd.printf("No Input Detected"); // corresponds to led case 4 - no guitar input present
Counter = 0;
}
}
现在,当我编译程序时,消息会打印出来。但是,LED 会在“太高”、“太低”和波浪线之间交替。我将是第一个承认我不是最好的编码员的人,这是我整个夏天真正要努力的事情。代码可能存在非常严重的问题,也可能是相对简单的问题。感谢所有意见。
注意:我没有连接面包板上的去抖动电路——它连接到我没有使用的诺基亚 LCD。我可以使用 mbed 应用程序板上的操纵杆在 1-6 之间更改所需的字符串。可以吗?或者是至关重要的去抖动电路?再次感谢。
最佳答案
寻找 low
的循环与寻找 high
的循环(几乎)相同:
high = 0;
low = 0;
for (int i=3; i<46; i+=3) {
high1 = goertzelFilter(Buffer, (note + i ), Counter);
if (high1 > high) high=high1;
}
for (int i=3; i<46; i+=3) {
low1 = goertzelFilter(Buffer, (note - i ), Counter);
if (low1 > low) low=low1;
}
我建议low
部分应该是这样的
low = FLT_MAX;
for (int i=3; i<46; i+=3) {
low1 = goertzelFilter(Buffer, (note - i ), Counter);
if (low1 < low) low=low1;
}
...虽然我可能误会了 low
的预期用途。
关于c++ - Mbed 吉他调音器代码问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36871517/
这是我的代码的链接:http://jsbin.com/ebadic/9/edit 它来 self 在这里找到的演示(此链接解释了它是如何工作的,我正在使用的部分位于底部): http://www.ht
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
我是一名优秀的程序员,十分优秀!