mirror of
https://github.com/cookiengineer/audacity
synced 2025-10-16 23:51:18 +02:00
Some rewriting in currently unused VoiceKey...
This commit is contained in:
146
src/VoiceKey.cpp
146
src/VoiceKey.cpp
@@ -39,7 +39,8 @@ using std::endl;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
VoiceKey::VoiceKey(){
|
VoiceKey::VoiceKey()
|
||||||
|
{
|
||||||
|
|
||||||
mWindowSize = 0.01; //size of analysis window in seconds
|
mWindowSize = 0.01; //size of analysis window in seconds
|
||||||
|
|
||||||
@@ -66,7 +67,8 @@ VoiceKey::VoiceKey(){
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
VoiceKey::~VoiceKey(){
|
VoiceKey::~VoiceKey()
|
||||||
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -83,7 +85,8 @@ VoiceKey::~VoiceKey(){
|
|||||||
|
|
||||||
|
|
||||||
//Move forward to find an ON region.
|
//Move forward to find an ON region.
|
||||||
sampleCount VoiceKey::OnForward (WaveTrack & t, sampleCount start, sampleCount len) {
|
sampleCount VoiceKey::OnForward (WaveTrack & t, sampleCount start, sampleCount len)
|
||||||
|
{
|
||||||
|
|
||||||
if((mWindowSize) >= len+10){
|
if((mWindowSize) >= len+10){
|
||||||
|
|
||||||
@@ -95,7 +98,7 @@ sampleCount VoiceKey::OnForward (WaveTrack & t, sampleCount start, sampleCount l
|
|||||||
wxMessageBox(_("Selection is too small to use voice key."));
|
wxMessageBox(_("Selection is too small to use voice key."));
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
|
|
||||||
sampleCount lastsubthresholdsample; // keeps track of the sample number of the last sample to not exceed the threshold
|
sampleCount lastsubthresholdsample; // keeps track of the sample number of the last sample to not exceed the threshold
|
||||||
|
|
||||||
@@ -104,9 +107,8 @@ sampleCount VoiceKey::OnForward (WaveTrack & t, sampleCount start, sampleCount l
|
|||||||
unsigned int WindowSizeInt = (unsigned int)(rate * mWindowSize); //Size of window to examine
|
unsigned int WindowSizeInt = (unsigned int)(rate * mWindowSize); //Size of window to examine
|
||||||
unsigned int SignalWindowSizeInt = (unsigned int)(rate * mSignalWindowSize); //This much signal is necessary to trip key
|
unsigned int SignalWindowSizeInt = (unsigned int)(rate * mSignalWindowSize); //This much signal is necessary to trip key
|
||||||
|
|
||||||
int samplesleft = len - WindowSizeInt; //Indexes the number of samples remaining in the selection
|
auto samplesleft = len - WindowSizeInt; //Indexes the number of samples remaining in the selection
|
||||||
lastsubthresholdsample = start; //start this off at the selection start
|
lastsubthresholdsample = start; //start this off at the selection start
|
||||||
unsigned int i; //iterates through waveblock
|
|
||||||
int blockruns=0; //keeps track of the number of consecutive above-threshold blocks
|
int blockruns=0; //keeps track of the number of consecutive above-threshold blocks
|
||||||
int blocksize; //The final block may be smaller than WindowSizeInt, so use this
|
int blocksize; //The final block may be smaller than WindowSizeInt, so use this
|
||||||
|
|
||||||
@@ -116,13 +118,14 @@ sampleCount VoiceKey::OnForward (WaveTrack & t, sampleCount start, sampleCount l
|
|||||||
//go through one sample at a time.
|
//go through one sample at a time.
|
||||||
//If there are fewer than 10 samples leftover, don't bother.
|
//If there are fewer than 10 samples leftover, don't bother.
|
||||||
|
|
||||||
for(i = start; samplesleft >=10; i+=(WindowSizeInt-1) , samplesleft -= (WindowSizeInt -1)){
|
for(auto i = start; samplesleft >= 10;
|
||||||
|
i += (WindowSizeInt - 1) , samplesleft -= (WindowSizeInt - 1)) {
|
||||||
|
|
||||||
//Set blocksize so that it is the right size
|
//Set blocksize so that it is the right size
|
||||||
if((unsigned int)samplesleft < WindowSizeInt){
|
if((unsigned int)samplesleft < WindowSizeInt){
|
||||||
blocksize = samplesleft;
|
blocksize = samplesleft;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
blocksize = WindowSizeInt;
|
blocksize = WindowSizeInt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +133,7 @@ sampleCount VoiceKey::OnForward (WaveTrack & t, sampleCount start, sampleCount l
|
|||||||
if(AboveThreshold(t,i,blocksize))
|
if(AboveThreshold(t,i,blocksize))
|
||||||
{
|
{
|
||||||
blockruns++; //Hit
|
blockruns++; //Hit
|
||||||
} else{
|
} else {
|
||||||
blockruns=0; //Miss--start over
|
blockruns=0; //Miss--start over
|
||||||
lastsubthresholdsample = i;
|
lastsubthresholdsample = i;
|
||||||
}
|
}
|
||||||
@@ -142,17 +145,17 @@ sampleCount VoiceKey::OnForward (WaveTrack & t, sampleCount start, sampleCount l
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Now, if we broke out early (samplesleft > 10), go back to the lastsubthresholdsample and look more carefully
|
//Now, if we broke out early (samplesleft > 10), go back to the lastsubthresholdsample and look more carefully
|
||||||
if(samplesleft > 10){
|
if(samplesleft > 10) {
|
||||||
|
|
||||||
|
|
||||||
//Calculate how many to scan through--we only have to go through (at most)
|
//Calculate how many to scan through--we only have to go through (at most)
|
||||||
//the first window + 1 samples--but we need another window samples to draw from.
|
//the first window + 1 samples--but we need another window samples to draw from.
|
||||||
samplesleft = 2*WindowSizeInt+1;
|
auto remaining = 2*WindowSizeInt+1;
|
||||||
|
|
||||||
//To speed things up, create a local buffer to store things in, to avoid the costly t.Get();
|
//To speed things up, create a local buffer to store things in, to avoid the costly t.Get();
|
||||||
//Only go through the first SignalWindowSizeInt samples, and choose the first that trips the key.
|
//Only go through the first SignalWindowSizeInt samples, and choose the first that trips the key.
|
||||||
float *buffer = new float[samplesleft];
|
float *buffer = new float[remaining];
|
||||||
t.Get((samplePtr)buffer, floatSample,lastsubthresholdsample,samplesleft);
|
t.Get((samplePtr)buffer, floatSample, lastsubthresholdsample, remaining);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -178,7 +181,8 @@ sampleCount VoiceKey::OnForward (WaveTrack & t, sampleCount start, sampleCount l
|
|||||||
|
|
||||||
|
|
||||||
//Now, go through the sound again, sample by sample.
|
//Now, go through the sound again, sample by sample.
|
||||||
for(i=0; i<SignalWindowSizeInt-WindowSizeInt;i++){
|
size_t i;
|
||||||
|
for(i = 0; i < SignalWindowSizeInt - WindowSizeInt; i++) {
|
||||||
|
|
||||||
int tests = 0;
|
int tests = 0;
|
||||||
int testThreshold = 0;
|
int testThreshold = 0;
|
||||||
@@ -227,9 +231,9 @@ sampleCount VoiceKey::OnForward (WaveTrack & t, sampleCount start, sampleCount l
|
|||||||
|
|
||||||
//When we get here, i+lastsubthresholdsample is the best guess for where the word starts
|
//When we get here, i+lastsubthresholdsample is the best guess for where the word starts
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
return i+lastsubthresholdsample;
|
return i + lastsubthresholdsample;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
//If we failed to find anything, return the start position
|
//If we failed to find anything, return the start position
|
||||||
return start ;
|
return start ;
|
||||||
}
|
}
|
||||||
@@ -237,7 +241,8 @@ sampleCount VoiceKey::OnForward (WaveTrack & t, sampleCount start, sampleCount l
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Move backward from end to find an ON region.
|
//Move backward from end to find an ON region.
|
||||||
sampleCount VoiceKey::OnBackward (WaveTrack & t, sampleCount end, sampleCount len) {
|
sampleCount VoiceKey::OnBackward (WaveTrack & t, sampleCount end, sampleCount len)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
if((mWindowSize) >= len+10){
|
if((mWindowSize) >= len+10){
|
||||||
@@ -245,7 +250,7 @@ sampleCount VoiceKey::OnBackward (WaveTrack & t, sampleCount end, sampleCount le
|
|||||||
wxMessageBox(_("Selection is too small to use voice key."));
|
wxMessageBox(_("Selection is too small to use voice key."));
|
||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
|
|
||||||
sampleCount lastsubthresholdsample; // keeps track of the sample number of the last sample to not exceed the threshold
|
sampleCount lastsubthresholdsample; // keeps track of the sample number of the last sample to not exceed the threshold
|
||||||
|
|
||||||
@@ -254,9 +259,8 @@ sampleCount VoiceKey::OnBackward (WaveTrack & t, sampleCount end, sampleCount le
|
|||||||
unsigned int WindowSizeInt = (unsigned int)(rate * mWindowSize); //Size of window to examine
|
unsigned int WindowSizeInt = (unsigned int)(rate * mWindowSize); //Size of window to examine
|
||||||
//unsigned int SilentWindowSizeInt = (unsigned int)(rate * mSilentWindowSize); //This much signal is necessary to trip key
|
//unsigned int SilentWindowSizeInt = (unsigned int)(rate * mSilentWindowSize); //This much signal is necessary to trip key
|
||||||
|
|
||||||
int samplesleft = len - WindowSizeInt; //Indexes the number of samples remaining in the selection
|
auto samplesleft = len - WindowSizeInt; //Indexes the number of samples remaining in the selection
|
||||||
lastsubthresholdsample = end; //start this off at the end
|
lastsubthresholdsample = end; //start this off at the end
|
||||||
unsigned int i; //iterates through waveblock
|
|
||||||
int blockruns=0; //keeps track of the number of consecutive above-threshold blocks
|
int blockruns=0; //keeps track of the number of consecutive above-threshold blocks
|
||||||
int blocksize; //The final block may be smaller than WindowSizeInt, so use this
|
int blocksize; //The final block may be smaller than WindowSizeInt, so use this
|
||||||
|
|
||||||
@@ -265,13 +269,14 @@ sampleCount VoiceKey::OnBackward (WaveTrack & t, sampleCount end, sampleCount le
|
|||||||
//of above-threshold blocks occur, we return to the last sub-threshold block and
|
//of above-threshold blocks occur, we return to the last sub-threshold block and
|
||||||
//go through one sample at a time.
|
//go through one sample at a time.
|
||||||
//If there are fewer than 10 samples leftover, don't bother.
|
//If there are fewer than 10 samples leftover, don't bother.
|
||||||
for(i = end - WindowSizeInt; samplesleft >=10; i-=(WindowSizeInt-1) , samplesleft -= (WindowSizeInt -1)){
|
for(auto i = end - WindowSizeInt; samplesleft >= 10;
|
||||||
|
i -= (WindowSizeInt - 1) , samplesleft -= (WindowSizeInt - 1)) {
|
||||||
|
|
||||||
//Set blocksize so that it is the right size
|
//Set blocksize so that it is the right size
|
||||||
if(samplesleft < (int)WindowSizeInt){
|
if(samplesleft < (int)WindowSizeInt){
|
||||||
blocksize = samplesleft;
|
blocksize = samplesleft;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
blocksize = WindowSizeInt;
|
blocksize = WindowSizeInt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,21 +299,21 @@ sampleCount VoiceKey::OnBackward (WaveTrack & t, sampleCount end, sampleCount le
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Now, if we broke out early (samplesleft > 10), go back to the lastsubthresholdsample and look more carefully
|
//Now, if we broke out early (samplesleft > 10), go back to the lastsubthresholdsample and look more carefully
|
||||||
if(samplesleft > 10){
|
if(samplesleft > 10) {
|
||||||
|
|
||||||
//Calculate how many to scan through--we only have to go through (at most)
|
//Calculate how many to scan through--we only have to go through (at most)
|
||||||
//the first window + 1 samples--but we need another window samples to draw from.
|
//the first window + 1 samples--but we need another window samples to draw from.
|
||||||
samplesleft = 2*WindowSizeInt+1;
|
auto remaining = 2*WindowSizeInt+1;
|
||||||
|
|
||||||
//To speed things up, create a local buffer to store things in, to avoid the costly t.Get();
|
//To speed things up, create a local buffer to store things in, to avoid the costly t.Get();
|
||||||
//Only go through the first mSilentWindowSizeInt samples, and choose the first that trips the key.
|
//Only go through the first mSilentWindowSizeInt samples, and choose the first that trips the key.
|
||||||
float *buffer = new float[samplesleft];
|
float *buffer = new float[remaining];
|
||||||
t.Get((samplePtr)buffer, floatSample, lastsubthresholdsample-samplesleft,samplesleft);
|
t.Get((samplePtr)buffer, floatSample, lastsubthresholdsample-remaining, remaining);
|
||||||
|
|
||||||
//Initialize these trend markers atrend and ztrend. They keep track of the
|
//Initialize these trend markers atrend and ztrend. They keep track of the
|
||||||
//up/down trends at the start and end of the evaluation window.
|
//up/down trends at the start and end of the evaluation window.
|
||||||
int atrend = sgn(buffer[samplesleft - 2]-buffer[samplesleft - 1]);
|
int atrend = sgn(buffer[remaining - 2]-buffer[remaining - 1]);
|
||||||
int ztrend = sgn(buffer[samplesleft - WindowSizeInt-2]-buffer[samplesleft - WindowSizeInt-2]);
|
int ztrend = sgn(buffer[remaining - WindowSizeInt-2]-buffer[remaining - WindowSizeInt-2]);
|
||||||
|
|
||||||
double erg=0;
|
double erg=0;
|
||||||
double sc = 0;
|
double sc = 0;
|
||||||
@@ -323,7 +328,8 @@ sampleCount VoiceKey::OnBackward (WaveTrack & t, sampleCount end, sampleCount le
|
|||||||
dc = TestDirectionChanges(t,lastsubthresholdsample,WindowSizeInt);
|
dc = TestDirectionChanges(t,lastsubthresholdsample,WindowSizeInt);
|
||||||
|
|
||||||
//Now, go through the sound again, sample by sample.
|
//Now, go through the sound again, sample by sample.
|
||||||
for(i=samplesleft-1; i>WindowSizeInt; i--){
|
size_t i;
|
||||||
|
for(i = remaining - 1; i > WindowSizeInt; i--) {
|
||||||
int tests = 0;
|
int tests = 0;
|
||||||
int testThreshold = 0;
|
int testThreshold = 0;
|
||||||
//Update the test statistics
|
//Update the test statistics
|
||||||
@@ -366,9 +372,9 @@ sampleCount VoiceKey::OnBackward (WaveTrack & t, sampleCount end, sampleCount le
|
|||||||
|
|
||||||
//When we get here, i+lastsubthresholdsample is the best guess for where the word starts
|
//When we get here, i+lastsubthresholdsample is the best guess for where the word starts
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
return lastsubthresholdsample - samplesleft + i;
|
return lastsubthresholdsample - remaining + i;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
//If we failed to find anything, return the start position
|
//If we failed to find anything, return the start position
|
||||||
return end ;
|
return end ;
|
||||||
}
|
}
|
||||||
@@ -377,14 +383,15 @@ sampleCount VoiceKey::OnBackward (WaveTrack & t, sampleCount end, sampleCount le
|
|||||||
|
|
||||||
|
|
||||||
//Move froward from the start to find an OFF region.
|
//Move froward from the start to find an OFF region.
|
||||||
sampleCount VoiceKey::OffForward (WaveTrack & t, sampleCount start, sampleCount len) {
|
sampleCount VoiceKey::OffForward (WaveTrack & t, sampleCount start, sampleCount len)
|
||||||
|
{
|
||||||
|
|
||||||
if((mWindowSize) >= len+10){
|
if((mWindowSize) >= len+10){
|
||||||
wxMessageBox(_("Selection is too small to use voice key."));
|
wxMessageBox(_("Selection is too small to use voice key."));
|
||||||
|
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
|
|
||||||
sampleCount lastsubthresholdsample; // keeps track of the sample number of the last sample to not exceed the threshold
|
sampleCount lastsubthresholdsample; // keeps track of the sample number of the last sample to not exceed the threshold
|
||||||
|
|
||||||
@@ -394,9 +401,8 @@ sampleCount VoiceKey::OffForward (WaveTrack & t, sampleCount start, sampleCount
|
|||||||
unsigned int WindowSizeInt = (unsigned int)(rate * mWindowSize); //Size of window to examine
|
unsigned int WindowSizeInt = (unsigned int)(rate * mWindowSize); //Size of window to examine
|
||||||
unsigned int SilentWindowSizeInt = (unsigned int)(rate * mSilentWindowSize); //This much signal is necessary to trip key
|
unsigned int SilentWindowSizeInt = (unsigned int)(rate * mSilentWindowSize); //This much signal is necessary to trip key
|
||||||
|
|
||||||
int samplesleft = len - WindowSizeInt; //Indexes the number of samples remaining in the selection
|
auto samplesleft = len - WindowSizeInt; //Indexes the number of samples remaining in the selection
|
||||||
lastsubthresholdsample = start; //start this off at the selection start
|
lastsubthresholdsample = start; //start this off at the selection start
|
||||||
unsigned int i; //iterates through waveblock
|
|
||||||
int blockruns=0; //keeps track of the number of consecutive above-threshold blocks
|
int blockruns=0; //keeps track of the number of consecutive above-threshold blocks
|
||||||
int blocksize; //The final block may be smaller than WindowSizeInt, so use this
|
int blocksize; //The final block may be smaller than WindowSizeInt, so use this
|
||||||
|
|
||||||
@@ -404,13 +410,14 @@ sampleCount VoiceKey::OffForward (WaveTrack & t, sampleCount start, sampleCount
|
|||||||
//of above-threshold blocks occur, we return to the last sub-threshold block and
|
//of above-threshold blocks occur, we return to the last sub-threshold block and
|
||||||
//go through one sample at a time.
|
//go through one sample at a time.
|
||||||
//If there are fewer than 10 samples leftover, don't bother.
|
//If there are fewer than 10 samples leftover, don't bother.
|
||||||
for(i = start; samplesleft >=10; i+=(WindowSizeInt-1) , samplesleft -= (WindowSizeInt -1)){
|
for(auto i = start; samplesleft >= 10;
|
||||||
|
i += (WindowSizeInt - 1) , samplesleft -= (WindowSizeInt - 1)) {
|
||||||
|
|
||||||
//Set blocksize so that it is the right size
|
//Set blocksize so that it is the right size
|
||||||
if(samplesleft < (int)WindowSizeInt){
|
if(samplesleft < (int)WindowSizeInt){
|
||||||
blocksize = samplesleft;
|
blocksize = samplesleft;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
blocksize = WindowSizeInt;
|
blocksize = WindowSizeInt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -431,17 +438,17 @@ sampleCount VoiceKey::OffForward (WaveTrack & t, sampleCount start, sampleCount
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Now, if we broke out early (samplesleft > 10), go back to the lastsubthresholdsample and look more carefully
|
//Now, if we broke out early (samplesleft > 10), go back to the lastsubthresholdsample and look more carefully
|
||||||
if(samplesleft > 10){
|
if(samplesleft > 10) {
|
||||||
|
|
||||||
|
|
||||||
//Calculate how many to scan through--we only have to go through (at most)
|
//Calculate how many to scan through--we only have to go through (at most)
|
||||||
//the first window + 1 samples--but we need another window samples to draw from.
|
//the first window + 1 samples--but we need another window samples to draw from.
|
||||||
samplesleft = 2*WindowSizeInt+1;
|
auto remaining = 2*WindowSizeInt+1;
|
||||||
|
|
||||||
//To speed things up, create a local buffer to store things in, to avoid the costly t.Get();
|
//To speed things up, create a local buffer to store things in, to avoid the costly t.Get();
|
||||||
//Only go through the first SilentWindowSizeInt samples, and choose the first that trips the key.
|
//Only go through the first SilentWindowSizeInt samples, and choose the first that trips the key.
|
||||||
float *buffer = new float[samplesleft];
|
float *buffer = new float[remaining];
|
||||||
t.Get((samplePtr)buffer, floatSample, lastsubthresholdsample,samplesleft);
|
t.Get((samplePtr)buffer, floatSample, lastsubthresholdsample, remaining);
|
||||||
|
|
||||||
//Initialize these trend markers atrend and ztrend. They keep track of the
|
//Initialize these trend markers atrend and ztrend. They keep track of the
|
||||||
//up/down trends at the start and end of the evaluation window.
|
//up/down trends at the start and end of the evaluation window.
|
||||||
@@ -462,7 +469,8 @@ sampleCount VoiceKey::OffForward (WaveTrack & t, sampleCount start, sampleCount
|
|||||||
dc = TestDirectionChanges(t,lastsubthresholdsample,WindowSizeInt);
|
dc = TestDirectionChanges(t,lastsubthresholdsample,WindowSizeInt);
|
||||||
|
|
||||||
//Now, go through the sound again, sample by sample.
|
//Now, go through the sound again, sample by sample.
|
||||||
for(i=0; i<SilentWindowSizeInt-WindowSizeInt;i++){
|
size_t i;
|
||||||
|
for(i = 0; i < SilentWindowSizeInt - WindowSizeInt; i++) {
|
||||||
int tests = 0;
|
int tests = 0;
|
||||||
int testThreshold = 0;
|
int testThreshold = 0;
|
||||||
//Update the test statistics
|
//Update the test statistics
|
||||||
@@ -505,9 +513,9 @@ sampleCount VoiceKey::OffForward (WaveTrack & t, sampleCount start, sampleCount
|
|||||||
|
|
||||||
//When we get here, i+lastsubthresholdsample is the best guess for where the word starts
|
//When we get here, i+lastsubthresholdsample is the best guess for where the word starts
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
return i+lastsubthresholdsample;
|
return i + lastsubthresholdsample;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
//If we failed to find anything, return the start position
|
//If we failed to find anything, return the start position
|
||||||
return start ;
|
return start ;
|
||||||
}
|
}
|
||||||
@@ -516,7 +524,8 @@ sampleCount VoiceKey::OffForward (WaveTrack & t, sampleCount start, sampleCount
|
|||||||
|
|
||||||
|
|
||||||
//Move backward from the end to find an OFF region
|
//Move backward from the end to find an OFF region
|
||||||
sampleCount VoiceKey::OffBackward (WaveTrack & t, sampleCount end, sampleCount len) {
|
sampleCount VoiceKey::OffBackward (WaveTrack & t, sampleCount end, sampleCount len)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
if((mWindowSize) >= len+10){
|
if((mWindowSize) >= len+10){
|
||||||
@@ -524,7 +533,7 @@ sampleCount VoiceKey::OffBackward (WaveTrack & t, sampleCount end, sampleCount l
|
|||||||
wxMessageBox(_("Selection is too small to use voice key."));
|
wxMessageBox(_("Selection is too small to use voice key."));
|
||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
|
|
||||||
sampleCount lastsubthresholdsample; // keeps track of the sample number of the last sample to not exceed the threshold
|
sampleCount lastsubthresholdsample; // keeps track of the sample number of the last sample to not exceed the threshold
|
||||||
|
|
||||||
@@ -533,9 +542,8 @@ sampleCount VoiceKey::OffBackward (WaveTrack & t, sampleCount end, sampleCount l
|
|||||||
unsigned int WindowSizeInt = (unsigned int)(rate * mWindowSize); //Size of window to examine
|
unsigned int WindowSizeInt = (unsigned int)(rate * mWindowSize); //Size of window to examine
|
||||||
//unsigned int SilentWindowSizeInt = (unsigned int)(rate * mSilentWindowSize); //This much signal is necessary to trip key
|
//unsigned int SilentWindowSizeInt = (unsigned int)(rate * mSilentWindowSize); //This much signal is necessary to trip key
|
||||||
|
|
||||||
int samplesleft = len - WindowSizeInt; //Indexes the number of samples remaining in the selection
|
auto samplesleft = len - WindowSizeInt; //Indexes the number of samples remaining in the selection
|
||||||
lastsubthresholdsample = end; //start this off at the end
|
lastsubthresholdsample = end; //start this off at the end
|
||||||
unsigned int i; //iterates through waveblock
|
|
||||||
int blockruns=0; //keeps track of the number of consecutive above-threshold blocks
|
int blockruns=0; //keeps track of the number of consecutive above-threshold blocks
|
||||||
int blocksize; //The final block may be smaller than WindowSizeInt, so use this
|
int blocksize; //The final block may be smaller than WindowSizeInt, so use this
|
||||||
|
|
||||||
@@ -543,13 +551,14 @@ sampleCount VoiceKey::OffBackward (WaveTrack & t, sampleCount end, sampleCount l
|
|||||||
//of above-threshold blocks occur, we return to the last sub-threshold block and
|
//of above-threshold blocks occur, we return to the last sub-threshold block and
|
||||||
//go through one sample at a time.
|
//go through one sample at a time.
|
||||||
//If there are fewer than 10 samples leftover, don't bother.
|
//If there are fewer than 10 samples leftover, don't bother.
|
||||||
for(i = end - WindowSizeInt; samplesleft >=10; i-=(WindowSizeInt-1) , samplesleft -= (WindowSizeInt -1)){
|
for(auto i = end - WindowSizeInt; samplesleft >= 10;
|
||||||
|
i -= (WindowSizeInt - 1), samplesleft -= (WindowSizeInt -1 )) {
|
||||||
|
|
||||||
//Set blocksize so that it is the right size
|
//Set blocksize so that it is the right size
|
||||||
if(samplesleft < (int)WindowSizeInt){
|
if(samplesleft < (int)WindowSizeInt){
|
||||||
blocksize = samplesleft;
|
blocksize = samplesleft;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
blocksize = WindowSizeInt;
|
blocksize = WindowSizeInt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -572,21 +581,24 @@ sampleCount VoiceKey::OffBackward (WaveTrack & t, sampleCount end, sampleCount l
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Now, if we broke out early (samplesleft > 10), go back to the lastsubthresholdsample and look more carefully
|
//Now, if we broke out early (samplesleft > 10), go back to the lastsubthresholdsample and look more carefully
|
||||||
if(samplesleft > 10){
|
if(samplesleft > 10) {
|
||||||
|
|
||||||
//Calculate how many to scan through--we only have to go through (at most)
|
//Calculate how many to scan through--we only have to go through (at most)
|
||||||
//the first window + 1 samples--but we need another window samples to draw from.
|
//the first window + 1 samples--but we need another window samples to draw from.
|
||||||
samplesleft = 2*WindowSizeInt+1;
|
auto remaining = 2*WindowSizeInt+1;
|
||||||
|
|
||||||
//To speed things up, create a local buffer to store things in, to avoid the costly t.Get();
|
//To speed things up, create a local buffer to store things in, to avoid the costly t.Get();
|
||||||
//Only go through the first SilentWindowSizeInt samples, and choose the first that trips the key.
|
//Only go through the first SilentWindowSizeInt samples, and choose the first that trips the key.
|
||||||
float *buffer = new float[samplesleft];
|
float *buffer = new float[remaining];
|
||||||
t.Get((samplePtr)buffer, floatSample, lastsubthresholdsample-samplesleft,samplesleft);
|
t.Get((samplePtr)buffer, floatSample,
|
||||||
|
lastsubthresholdsample - remaining, remaining);
|
||||||
|
|
||||||
//Initialize these trend markers atrend and ztrend. They keep track of the
|
//Initialize these trend markers atrend and ztrend. They keep track of the
|
||||||
//up/down trends at the start and end of the evaluation window.
|
//up/down trends at the start and end of the remaining window.
|
||||||
int atrend = sgn(buffer[samplesleft - 2]-buffer[samplesleft - 1]);
|
int atrend = sgn(buffer[remaining - 2] - buffer[remaining - 1]);
|
||||||
int ztrend = sgn(buffer[samplesleft - WindowSizeInt-2]-buffer[samplesleft - WindowSizeInt-2]);
|
int ztrend =
|
||||||
|
sgn(buffer[remaining - WindowSizeInt - 2] -
|
||||||
|
buffer[remaining - WindowSizeInt - 2]);
|
||||||
|
|
||||||
double erg=0;
|
double erg=0;
|
||||||
double sc=0;
|
double sc=0;
|
||||||
@@ -600,7 +612,8 @@ sampleCount VoiceKey::OffBackward (WaveTrack & t, sampleCount end, sampleCount l
|
|||||||
dc = TestDirectionChanges(t,lastsubthresholdsample,WindowSizeInt);
|
dc = TestDirectionChanges(t,lastsubthresholdsample,WindowSizeInt);
|
||||||
|
|
||||||
//Now, go through the sound again, sample by sample.
|
//Now, go through the sound again, sample by sample.
|
||||||
for(i=samplesleft-1; i>WindowSizeInt; i--){
|
size_t i;
|
||||||
|
for(i = remaining - 1; i > WindowSizeInt; i--) {
|
||||||
|
|
||||||
int tests = 0;
|
int tests = 0;
|
||||||
int testThreshold = 0;
|
int testThreshold = 0;
|
||||||
@@ -646,9 +659,9 @@ sampleCount VoiceKey::OffBackward (WaveTrack & t, sampleCount end, sampleCount l
|
|||||||
|
|
||||||
//When we get here, i+lastsubthresholdsample is the best guess for where the word starts
|
//When we get here, i+lastsubthresholdsample is the best guess for where the word starts
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
return lastsubthresholdsample - samplesleft + i;
|
return lastsubthresholdsample - remaining + i;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
//If we failed to find anything, return the start position
|
//If we failed to find anything, return the start position
|
||||||
return end ;
|
return end ;
|
||||||
}
|
}
|
||||||
@@ -724,7 +737,8 @@ bool VoiceKey::AboveThreshold(WaveTrack & t, sampleCount start, sampleCount len)
|
|||||||
|
|
||||||
//This adjusts the threshold. Larger values of t expand the noise region,
|
//This adjusts the threshold. Larger values of t expand the noise region,
|
||||||
//making more things be classified as noise (and requiring a stronger signal).
|
//making more things be classified as noise (and requiring a stronger signal).
|
||||||
void VoiceKey::AdjustThreshold(double t){
|
void VoiceKey::AdjustThreshold(double t)
|
||||||
|
{
|
||||||
|
|
||||||
mThresholdAdjustment = t;
|
mThresholdAdjustment = t;
|
||||||
mThresholdEnergy = mEnergyMean + mEnergySD * t;
|
mThresholdEnergy = mEnergyMean + mEnergySD * t;
|
||||||
@@ -736,7 +750,8 @@ void VoiceKey::AdjustThreshold(double t){
|
|||||||
|
|
||||||
|
|
||||||
//This 'calibrates' the voicekey to noise
|
//This 'calibrates' the voicekey to noise
|
||||||
void VoiceKey::CalibrateNoise(WaveTrack & t, sampleCount start, sampleCount len){
|
void VoiceKey::CalibrateNoise(WaveTrack & t, sampleCount start, sampleCount len)
|
||||||
|
{
|
||||||
//To calibrate the noise, we need to scan the sample block just like in the voicekey and
|
//To calibrate the noise, we need to scan the sample block just like in the voicekey and
|
||||||
//calculate the mean and standard deviation of the test statistics.
|
//calculate the mean and standard deviation of the test statistics.
|
||||||
//Then, we set the BaselineThreshold to be one
|
//Then, we set the BaselineThreshold to be one
|
||||||
@@ -779,13 +794,12 @@ void VoiceKey::CalibrateNoise(WaveTrack & t, sampleCount start, sampleCount len)
|
|||||||
|
|
||||||
|
|
||||||
// int n = len - WindowSizeInt; //This is how many samples we have
|
// int n = len - WindowSizeInt; //This is how many samples we have
|
||||||
int samplesleft = len - WindowSizeInt;
|
auto samplesleft = len - WindowSizeInt;
|
||||||
int i;
|
|
||||||
int blocksize;
|
int blocksize;
|
||||||
int samples=0;
|
int samples=0;
|
||||||
|
|
||||||
for(i = start; samplesleft >=10 ; i += (WindowSizeInt -1), samplesleft -= (WindowSizeInt -1) )
|
for(auto i = start; samplesleft >= 10;
|
||||||
{
|
i += (WindowSizeInt - 1), samplesleft -= (WindowSizeInt -1) ) {
|
||||||
//Take samples chunk-by-chunk.
|
//Take samples chunk-by-chunk.
|
||||||
//Normally, this should be in WindowSizeInt chunks, but at the end (if there are more than 10
|
//Normally, this should be in WindowSizeInt chunks, but at the end (if there are more than 10
|
||||||
//samples left) take a chunk that eats the rest of the samples.
|
//samples left) take a chunk that eats the rest of the samples.
|
||||||
|
Reference in New Issue
Block a user