Created
April 24, 2012 20:51
-
-
Save bartolsthoorn/2483604 to your computer and use it in GitHub Desktop.
Multiple signal generator with broken filter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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