Hi MarkT,
Here is the error message: Arduino: 1.8.16 (Windows 10), TD: 1.55, Board: "Teensy 4.1, Audio, 600 MHz, Faster, US English"
C:\Users\wuxue\AppData\Local\Temp\arduino_build_554703\sketch\NHS.ino.cpp.o: In function `loop':
D:\NHS/NHS.ino:227: undefined reference to `AudioPlayQueue:
lay(short const*, unsigned long)'
D:\NHS/NHS.ino:228: undefined reference to `AudioPlayQueue:
lay(short const*, unsigned long)'
collect2.exe: error: ld returned 1 exit status
Multiple libraries were found for "SD.h"
Used: D:\Arduino\hardware\teensy\avr\libraries\SD
Not used: D:\Arduino\libraries\SD
Error compiling for board Teensy 4.1.
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Here are my codes. Could you please tell me what's the problem? Many thanks!
#include <arm_math.h>
#include <arm_const_structs.h>
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
// GUItool: begin automatically generated code
AudioInputUSB usb1; //xy=266.5,251
AudioInputI2S i2s1; //xy=268.25,391.75
AudioMixer4 mixer3; //xy=489,404
AudioEffectFreeverb freeverb1; //xy=713.25,403.75
AudioMixer4 mixer1; //xy=994.611083984375,263.0793762207031
AudioMixer4 mixer2; //xy=996.0753173828125,410.98419189453125
AudioRecordQueue queue1; //xy=1253.416748046875,264.2777862548828
AudioRecordQueue queue2; //xy=1254.8333740234375,410.8611145019531
AudioPlayQueue queue3; //xy=1438,267
AudioPlayQueue queue4; //xy=1439,411
AudioOutputUSB usb2; //xy=1664.4444160461426,273.33335399627686
AudioOutputI2S i2s2; //xy=1665.3333282470703,404.33333015441895
AudioConnection patchCord1(usb1, 0, mixer1, 0);
AudioConnection patchCord2(usb1, 1, mixer2, 0);
AudioConnection patchCord3(i2s1, 0, mixer3, 0);
AudioConnection patchCord4(i2s1, 1, mixer3, 1);
AudioConnection patchCord5(mixer3, freeverb1);
AudioConnection patchCord6(freeverb1, 0, mixer1, 1);
AudioConnection patchCord7(freeverb1, 0, mixer2, 1);
AudioConnection patchCord8(mixer1, queue1);
AudioConnection patchCord9(mixer2, queue2);
AudioConnection patchCord10(queue3, 0, i2s2, 0);
AudioConnection patchCord11(queue3, 0, usb2, 0);
AudioConnection patchCord12(queue4, 0, i2s2, 1);
AudioConnection patchCord13(queue4, 0, usb2, 1);
// GUItool: end automatically generated code
float32_t sZ1L[11] = {0};
float32_t sZ2L[11] = {0};
float32_t sZ1R[11] = {0};
float32_t sZ2R[11] = {0};
void setup() {
// put your setup code here, to run once:
mixer3.gain(0, 1.0);
mixer3.gain(1, -1.0);
mixer1.gain(0, 1.0);
mixer1.gain(1, 1.0);
mixer2.gain(0, 1.0);
mixer2.gain(1, 1.0);
queue1.begin();
queue2.begin();
}
void loop() {
// put your main code here, to run repeatedly:
if (queue1.available() == 4 && queue2.available() == 4)
{
int fftsize = 512;
int numofnotch = 10;
float32_t r = 0.85;
arm_rfft_fast_instance_f32 fftL_handler;
arm_rfft_fast_instance_f32 fftR_handler;
arm_rfft_fast_init_f32(&fftL_handler, fftsize);
arm_rfft_fast_init_f32(&fftR_handler, fftsize);
float32_t fftL_in_buf[fftsize];
float32_t fftL_out_buf[fftsize];
float32_t fftR_in_buf[fftsize];
float32_t fftR_out_buf[fftsize];
float32_t freqpowL[fftsize/2];
float32_t freqpowR[fftsize/2];
int numofpeaksL = 0;
int peaksindexL[fftsize/4];
int numofpeaksR = 0;
int peaksindexR[fftsize/4];
// float32_t tmp_find_candidatesL[fftsize/4];
// float32_t tmp_find_candidatesR[fftsize/4];
// int numofcandidates = 6;
// float32_t candidatespowL[numofcandidates];
// uint32_t candindexL[numofcandidates];
// float32_t candidatespowR[numofcandidates];
// uint32_t candindexR[numofcandidates];
float32_t avgpowL;
float32_t avgpowR;
int PAPRthreshold = 6;
int numofhowlingL = 0;
int numofhowlingR = 0;
for (int j = 0; j < fftsize/128; j = j+1){
for (int i = 128*j; i < 128*(j+1); i = i+1){
fftL_in_buf
= (float)(queue1.readBuffer() * (1.0f / 32768.0f));
fftL_in_buf *= 0.5*(1-arm_cos_f32(2*PI*i/fftsize));
fftR_in_buf = (float)(queue2.readBuffer() * (1.0f / 32768.0f));
fftR_in_buf *= 0.5*(1-arm_cos_f32(2*PI*i/fftsize));
}
queue1.freeBuffer();
queue2.freeBuffer();
}
arm_rfft_fast_f32(&fftL_handler, fftL_in_buf, fftL_out_buf, 0);
arm_rfft_fast_f32(&fftR_handler, fftR_in_buf, fftR_out_buf, 0);
arm_cmplx_mag_squared_f32(fftL_out_buf, freqpowL, fftsize/2);
arm_cmplx_mag_squared_f32(fftR_out_buf, freqpowR, fftsize/2);
for(int i = 0; i < fftsize/2; i = i+1){
if (i == 0){
if (freqpowL[i+1]-freqpowL < 0){
numofpeaksL += 1;
peaksindexL[numofpeaksL] = i;
}
if (freqpowR[i+1]-freqpowR < 0){
numofpeaksR += 1;
peaksindexR[numofpeaksR] = i;
}
}
else if (i == fftsize/2 - 1){
if (freqpowL-freqpowL[i-1] > 0){
numofpeaksL += 1;
peaksindexL[numofpeaksL] = i;
}
if (freqpowR-freqpowR[i-1] > 0){
numofpeaksR += 1;
peaksindexR[numofpeaksR] = i;
}
}
else {
if((freqpowL-freqpowL[i-1])*(freqpowL[i+1]-freqpowL) < 0){
numofpeaksL += 1;
peaksindexL[numofpeaksL] = i;
}
if((freqpowR-freqpowR[i-1])*(freqpowR[i+1]-freqpowR) < 0){
numofpeaksR += 1;
peaksindexR[numofpeaksR] = i;
}
}
}
// for (int i = 0; i < numofpeaksL; i = i+1){
// tmp_find_candidatesL = freqpowL[peaksindexL];
// }
//
// for (int i = 0; i < numofpeaksR; i = i+1){
// tmp_find_candidatesR = freqpowR[peaksindexR];
// }
//
// for (int i = 0; i < numofcandidates; i = i+1){
// arm_max_f32(tmp_find_candidatesL, fftsize/2, &candidatespowL, &candindexL);
// arm_max_f32(tmp_find_candidatesR, fftsize/2, &candidatespowR, &candindexR);
// tmp_find_candidatesL[candindexL] = 0;
// tmp_find_candidatesR[candindexR] = 0;
// }
int howlingindexL[numofpeaksL];
int howlingindexR[numofpeaksR];
arm_mean_f32(freqpowL, fftsize/2, &avgpowL);
arm_mean_f32(freqpowR, fftsize/2, &avgpowR);
for (int i = 0; i < numofpeaksL; i = i+1){
if (10*log10(freqpowL[peaksindexL]/avgpowL) > PAPRthreshold){
numofhowlingL += 1;
howlingindexL[numofhowlingL] = peaksindexL;
}
}
for (int i = 0; i < numofpeaksR; i = i+1){
if (10*log10(freqpowR[peaksindexR]/avgpowR) > PAPRthreshold){
numofhowlingR += 1;
howlingindexR[numofhowlingR] = peaksindexR;
}
}
int16_t outsamplesL[fftsize];
int16_t outsamplesR[fftsize];
for (int i = 0; i < numofnotch; i = i+1){
float32_t NotchCoeffs[5];
if (i <= numofhowlingL){
NotchCoeffs[0] = 1.0f;
NotchCoeffs[1] = -2.0f * arm_cos_f32(PI*howlingindexL/(fftsize/2));
NotchCoeffs[2] = 1.0f;
NotchCoeffs[3] = -2.0f * r * arm_cos_f32(PI*howlingindexL/(fftsize/2));
NotchCoeffs[4] = r * r;
}
else {
NotchCoeffs[0] = 1.0f;
NotchCoeffs[1] = 0.0f;
NotchCoeffs[2] = 0.0f;
NotchCoeffs[3] = 0.0f;
NotchCoeffs[4] = 0.0f;
}
for (int j = 0; j < fftsize; j = j+1){
outsamplesL[j] = (int16_t)(BiquadNotch(fftL_in_buf[j], NotchCoeffs, sZ1L, sZ2L) * 32768.0f);
}
}
for (int i = 0; i < numofnotch; i = i+1){
float32_t NotchCoeffs[5];
if (i <= numofhowlingR){
NotchCoeffs[0] = 1.0f;
NotchCoeffs[1] = -2.0f * arm_cos_f32(PI*howlingindexR/(fftsize/2));
NotchCoeffs[2] = 1.0f;
NotchCoeffs[3] = -2.0f * r * arm_cos_f32(PI*howlingindexR/(fftsize/2));
NotchCoeffs[4] = r * r;
}
else {
NotchCoeffs[0] = 1.0f;
NotchCoeffs[1] = 0.0f;
NotchCoeffs[2] = 0.0f;
NotchCoeffs[3] = 0.0f;
NotchCoeffs[4] = 0.0f;
}
for (int j = 0; j < fftsize; j = j+1){
outsamplesR[j] = (int16_t)(BiquadNotch(fftR_in_buf[j], NotchCoeffs, sZ1R, sZ2R) * 32768.0f);
}
}
queue3.play(outsamplesL, fftsize);
queue4.play(outsamplesR, fftsize);
}
}
float32_t BiquadNotch (float32_t insample, float32_t* NotchCoeffs, float32_t* sZ1, float32_t* sZ2){
return insample;
}