Skip to content

Instantly share code, notes, and snippets.

@bartolsthoorn
Created April 24, 2012 20:51
Show Gist options
  • Save bartolsthoorn/2483604 to your computer and use it in GitHub Desktop.
Save bartolsthoorn/2483604 to your computer and use it in GitHub Desktop.
Multiple signal generator with broken filter
// MULTIPLE SIGNAL GENERATOR!
__block float *phases = nil;
__block float dbVal = 0.0;
__block float *dbData;
[audioManager setOutputBlock:^(float *data, UInt32 numFrames, UInt32 numChannels)
{
float samplingRate = audioManager.samplingRate;
NSUInteger activeSignalCount = [tones count];
// Initialize phases
if (phases == nil) {
phases = new float[10];
for(int z = 0; z <= 10; z++) {
phases[z] = 0.0;
}
}
// Multiple signals
NSEnumerator * enumerator = [tones objectEnumerator];
id frequency;
UInt32 c = 0;
while(frequency = [enumerator nextObject])
{
for (int i=0; i < numFrames; ++i)
{
for (int iChannel = 0; iChannel < numChannels; ++iChannel)
{
float theta = phases[c] * M_PI * 2;
if (c == 0) {
data[i*numChannels + iChannel] = sin(theta);
} else {
data[i*numChannels + iChannel] = data[i*numChannels + iChannel] + sin(theta);
}
}
phases[c] += 1.0 / (samplingRate / [frequency floatValue]);
if (phases[c] > 1.0) phases[c] = -1;
}
c++;
}
// Normalize data with active signal count
float signalMulti = 1.0 / (float(activeSignalCount) * (sqrt(2.0)));
vDSP_vsmul(data, 1, &signalMulti, data, 1, numFrames*numChannels);
// Apply master volume
float volume = masterVolumeSlider.value;
vDSP_vsmul(data, 1, &volume, data, 1, numFrames*numChannels);
// Filter
float *coefficients = (float *) calloc(5, sizeof(float));
float filterFreq = samplingRate/2.0f;
float rc = 1.0f / (2.0f * M_PI * filterFreq);
float alpha = rc / (rc + (1.0f/samplingRate));
coefficients[0] = alpha;
coefficients[1] = -1.0f * alpha;
coefficients[3] = -1.0f * alpha;
vDSP_deq22(data, 1, coefficients, data, 1, numFrames*numChannels);
free(coefficients);
// Measure dB
dbData = new float[numFrames*numChannels];
vDSP_vsq(data, 1, dbData, 1, numFrames*numChannels);
float meanVal = 0.0;
vDSP_meanv(dbData, 1, &meanVal, numFrames*numChannels);
float one = 1.0;
vDSP_vdbcon(&meanVal, 1, &one, &meanVal, 1, 1, 0);
dbVal = dbVal + 0.2*(meanVal - dbVal);
dBlevel = dbVal;
if (dbVal != dbVal) {
//nan
dbVal = -50;
}
}];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment