📄 frequencyscanner.cpp
字号:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "FrequencyScanner.h"
#include "Settings_F.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#include <stdio.h>
__fastcall SettingsInvestigator::SettingsInvestigator(FrequencyScanner *FreqScanner,TThreadPriority tPriority)
: TThread(true)
{
FreeOnTerminate=false;
Priority=tPriority;
OnTerminate=FinshedEvent;
Finished=false;
Working=false;
fs=FreqScanner;
//Resume();
}
void __fastcall SettingsInvestigator::FinshedEvent(TObject* Sender)
{
Finished=true;
}
void __fastcall SettingsInvestigator::Execute()
{
while(!Terminated)
{
if(Terminated)break;
//--
fs->DoTheXform();
//--
Working=false;
if(!Terminated)Suspend();
}
}
void __fastcall SettingsInvestigator::ThreadTheXForm(void)
{
Working=true;
Resume();
}
void __fastcall FrequencyScanner::SetupSoundcard()
{
/*while(invest->Working)
{
Sleep(100);
Application->ProcessMessages();
} */
if((gSettings.Common.Samplerate)<90000)N=131072;
else N=131072*2;
if((gSettings.Common.Samplerate)>100000)N=131072*2*2;
N_2=N/2;
if(in)fftw_free(in);
if(out)fftw_free(out);
if(p)fftw_destroy_plan(p);
in = (double*) fftw_malloc(sizeof(double) * N);
out = (double*) fftw_malloc(sizeof(double) * N);
//?? test to see if this is where the bug is . tryied and still get error
ProgressThread *pt=new ProgressThread(N,in,out,&p);
Sleep(100);
Application->ProcessMessages();
if(!pt->Finished)
{
ProgressForm->Finished=&(pt->Finished);
ProgressForm->ShowModal();
}
//p=pt->plan;
delete pt;
//p=fftw_plan_r2r_1d(N,in,out,FFTW_R2HC,FFTW_MEASURE);
//Application->MessageBox("Soundcard set freq scanner", "Alert!", MB_OK);
PosibleFrequencySettingsPtr=0;
CopyOfPosibleFrequencySettingsPtr=0;
CopyOfPosibleFrequencySettingsSize=0;
MABuf.resize(40);
MASum=0.0;
for(int i=0;i<MABuf.size();i++)MABuf[i]=0.0;
MAPtr=0;
MABuf2.resize(100);
MASum2=0.0;
for(int i=0;i<MABuf2.size();i++)MABuf2[i]=0.0;
MAPtr2=0;
outinternalave.resize(N);
outinternalaveworking.resize(N);
for(int i=0;i<outinternalave.size();i++)
{
outinternalave[i]=0.0;
outinternalaveworking[i]=0.0;
}
outinternalavepos=0;
NPtr=0;
NoteForMain=false;
WorkingSettings.Freq=gSettings.DemodMajor.Freq;
WorkingSettings.Gamma=gSettings.DemodMajor.Gamma;
WorkingSettings.SignalPower=0.0;
}
__fastcall FrequencyScanner::~FrequencyScanner()
{
gSettings.DemodMajorRemoveCallBackNotificationFunction(SettingsHaveChanged);
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
invest->Terminate();
invest->Resume();
while(!invest->Finished)
{
Sleep(100);
Application->ProcessMessages();
}
delete invest;
}
void __fastcall FrequencyScanner::Start()
{
SigLevel=0.0;
MAX_NUMBER_OF_POSIBLE_FREQS_TO_TRY=SettingsForm->JvValidateEditNumberOfSettingsToTry->Value;
//just reserve some space
PosibleFrequencySettings.resize(12);//MAX_NUMBER_OF_POSIBLE_FREQS_TO_TRY+1);
CopyOfPosibleFrequencySettings.resize(12);//MAX_NUMBER_OF_POSIBLE_FREQS_TO_TRY+1);
if(PosibleFrequencySettingsPtr>MAX_NUMBER_OF_POSIBLE_FREQS_TO_TRY)PosibleFrequencySettingsPtr=MAX_NUMBER_OF_POSIBLE_FREQS_TO_TRY;
// if(CopyOfPosibleFrequencySettingsSize<PosibleFrequencySettingsPtr)CopyOfPosibleFrequencySettingsSize=PosibleFrequencySettingsPtr;
//PosibleFrequencySettingsPtr=0;
// CopyOfPosibleFrequencySettingsPtr=0;
// CopyOfPosibleFrequencySettingsSize=0;
}
__fastcall FrequencyScanner::FrequencyScanner()
{
invest=new SettingsInvestigator(this,tpLowest);//tpIdle);
in=0;out=0;p=0;
gSettings.DemodMajorAddCallBackNotificationFuction(SettingsHaveChanged);
SettingsHaveChanged(CH_ANYTHING|CH_SAMPLERATE);
}
void __fastcall FrequencyScanner::SettingsHaveChanged(NotificationEventType WhatHasChanged)
{
if(WhatHasChanged&CH_SAMPLERATE)SetupSoundcard();
Start();
}
void __fastcall FrequencyScanner::LoadPosibleFrequencys()
{
bool TmpWorkingSettingStillValid=false;
PosibleFrequencySettingsPtr=0;
PosibleFrequencySettings[MAX_NUMBER_OF_POSIBLE_FREQS_TO_TRY-1].SignalPower=0.0;
for(int j=10;j<N/4;j++)
{
if((outinternalave[j]>10.0)&&(outinternalave[j-1]<outinternalave[j])&&(outinternalave[j+1]<outinternalave[j]))
{
//posible f/gamma
for(int k=2*j-2;k<min(4*j+2,N_2+2);k++)
{
if((outinternalave[k]>10.0)&&(outinternalave[k-1]<outinternalave[k])&&(outinternalave[k+1]<outinternalave[k]))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -