2012-06-08 17 views
6

Mam badane o tym, aby odtworzyć dźwięk sygnału dźwiękowego w iphone związanych z częstotliwości decybeli, które podałem.Odtwórz dźwięk sygnału dźwiękowego w iphone Podobne do częstotliwości i decybeli

Linki odniosłem:

http://developer.apple.com/library/ios/#samplecode/MusicCube/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008978

http://www.politepix.com/2010/06/18/decibel-metering-from-an-iphone-audio-unit/

http://atastypixel.com/blog/using-remoteio-audio-unit/

http://www.politepix.com/2010/06/18/decibel-metering-from-an-iphone-audio-unit/

How to play a sound of paticular frequency and framework not found AudioUnit question

Używam również Flite do przetwarzania tekstu na mowę w mojej aplikacji.

Czy mogę wiedzieć, czy można odtworzyć dźwięk sygnału dźwiękowego w iPhonie związany z częstotliwością & decybeli za pomocą flite.

Wiem, że tworzą plik dźwiękowy zgodnie z danymi wejściowymi (tylko w odniesieniu do wysokości, wariancji, prędkości i danego ciągu znaków) i odtwarzają go po utworzeniu Audioplayer.

Ale nie mają niestandardowych metod ustawiania częstotliwości decybeli & !!!!

Więc może ktoś mi dobry sposób to zrobić w iphone.

Każda pomoc na to pytanie jest doceniana.

Dzięki

+0

Decybele (dB) służą do wyrażenia współczynnika * pomiędzy dwiema wielkościami. Prawdopodobnie masz na myśli 'dB SPL' (dB Poziom ciśnienia akustycznego), czyli ludzie zwykle mają na myśli, kiedy mówią o tym, jak głośno jest dźwięk w decybelach. Aby wygenerować dźwięk o danej amplitudzie dB SPL, musisz jednak w jakiś sposób skalibrować sprzęt. –

+0

Ja też potrzebuję tego samego ..... muszę utworzyć sygnał dźwiękowy asper i decybel .... patrzę na .. –

Odpowiedz

0

Klasa ta pozwala na odtwarzanie sygnału dźwiękowego przy danej częstotliwości, a wraz z danej amplitudzie. Używa AudioQueues z AudioToolbox.framework. To tylko szkic, wiele rzeczy powinno zostać dopracowanych, ale mechanizm tworzenia sygnału działa.

Użycie jest bardzo proste, jeśli widzisz @interface.

#import <AudioToolbox/AudioToolbox.h> 
#define TONE_SAMPLERATE 44100. 

@interface Tone : NSObject { 
    AudioQueueRef queue; 
    AudioQueueBufferRef buffer; 
    BOOL rebuildBuffer; 
} 
@property (nonatomic, assign) NSUInteger frequency; 
@property (nonatomic, assign) CGFloat dB; 

- (void)play; 
- (void)pause; 
@end 


@implementation Tone 
@synthesize dB=_dB,frequency=_frequency; 

void handleBuffer(void *inUserData, 
        AudioQueueRef inAQ, 
        AudioQueueBufferRef inBuffer); 

#pragma mark - Initialization and deallocation - 

- (id)init 
{ 
    if ((self=[super init])) { 

     _dB=0.; 
     _frequency=440; 
     rebuildBuffer=YES; 

     // TO DO: handle AudioQueueXYZ's failures!! 

     // create a descriptor containing a LPCM, mono, float format 
     AudioStreamBasicDescription desc; 

     desc.mSampleRate=TONE_SAMPLERATE; 
     desc.mFormatID=kAudioFormatLinearPCM; 
     desc.mFormatFlags=kLinearPCMFormatFlagIsFloat; 
     desc.mBytesPerPacket=sizeof(float); 
     desc.mFramesPerPacket=1; 
     desc.mBytesPerFrame=sizeof(float); 
     desc.mChannelsPerFrame=1; 
     desc.mBitsPerChannel=8*sizeof(float); 

     // create a new queue 
     AudioQueueNewOutput(&desc, 
          &handleBuffer, 
          self, 
          CFRunLoopGetCurrent(), 
          kCFRunLoopCommonModes, 
          0, 
          &queue); 

     // and its buffer, ready to hold 1" of data 
     AudioQueueAllocateBuffer(queue, 
           sizeof(float)*TONE_SAMPLERATE, 
           &buffer); 

     // create the buffer and enqueue it 
     handleBuffer(self, queue, buffer); 

    } 
    return self; 
} 

- (void)dealloc 
{ 
    AudioQueueStop(queue, YES); 
    AudioQueueFreeBuffer(queue, buffer); 
    AudioQueueDispose(queue, YES); 

    [super dealloc]; 
} 

#pragma mark - Main function - 

void handleBuffer(void *inUserData, 
       AudioQueueRef inAQ, 
       AudioQueueBufferRef inBuffer) { 

    // this function takes care of building the buffer and enqueuing it. 

    // cast inUserData type to Tone 
    Tone *tone=(Tone *)inUserData; 

    // check if the buffer must be rebuilt 
    if (tone->rebuildBuffer) { 

     // precompute some useful qtys 
     float *data=inBuffer->mAudioData; 
     NSUInteger max=inBuffer->mAudioDataBytesCapacity/sizeof(float); 

     // multiplying the argument by 2pi changes the period of the cosine 
     // function to 1s (instead of 2pi). then we must divide by the sample 
     // rate to get TONE_SAMPLERATE samples in one period. 
     CGFloat unit=2.*M_PI/TONE_SAMPLERATE; 
     // this is the amplitude converted from dB to a linear scale 
     CGFloat amplitude=pow(10., tone.dB*.05); 

     // loop and simply set data[i] to the value of cos(...) 
     for (NSUInteger i=0; i<max; ++i) 
      data[i]=(float)(amplitude*cos(unit*(CGFloat)(tone.frequency*i))); 

     // inform the queue that we have filled the buffer 
     inBuffer->mAudioDataByteSize=sizeof(float)*max; 

     // and set flag 
     tone->rebuildBuffer=NO; 
    } 

    // reenqueue the buffer 
    AudioQueueEnqueueBuffer(inAQ, 
          inBuffer, 
          0, 
          NULL); 

    /* TO DO: the transition between two adjacent buffers (the same one actually) 
       generates a "tick", even if the adjacent buffers represent a continuous signal. 
       maybe using two buffers instead of one would fix it. 
    */ 
} 

#pragma - Properties and methods - 

- (void)play 
{ 
    // generate an AudioTimeStamp with "0" simply! 
    // (copied from FillOutAudioTimeStampWithSampleTime) 

    AudioTimeStamp time; 

    time.mSampleTime=0.; 
    time.mRateScalar=0.; 
    time.mWordClockTime=0.; 
    memset(&time.mSMPTETime, 0, sizeof(SMPTETime)); 
    time.mFlags = kAudioTimeStampSampleTimeValid; 

    // TO DO: maybe it could be useful to check AudioQueueStart's return value 
    AudioQueueStart(queue, &time); 
} 

- (void)pause 
{ 
    // TO DO: maybe it could be useful to check AudioQueuePause's return value 
    AudioQueuePause(queue); 
} 

- (void)setFrequency:(NSUInteger)frequency 
{ 
    if (_frequency!=frequency) { 
     _frequency=frequency; 

     // we need to update the buffer (as soon as it stops playing) 
     rebuildBuffer=YES; 
    } 
} 

- (void)setDB:(CGFloat)dB 
{ 
    if (dB!=_dB) { 
     _dB=dB; 

     // we need to update the buffer (as soon as it stops playing) 
     rebuildBuffer=YES; 
    } 
} 

@end 
  • klasa wytwarza cos fali wahliwie na danej częstotliwości (całkowitej amplitudy * cos (2pi * częstotliwość T *)); cała praca jest wykonywana przez void handleBuffer(...), używając AudioQueue z liniowym formatem PCM, mono, float @ 44.1kHz. Aby zmienić kształt sygnału, możesz po prostu zmienić tę linię. Na przykład, następujący kod będzie produkować kwadratową fali:

    float x = fmodf(unit*(CGFloat)(tone.frequency*i), 2 * M_PI); 
    data[i] = amplitude * (x > M_PI ? -1.0 : 1.0); 
    
  • dla pływających częstotliwości momencie, należy wziąć pod uwagę, że nie ma necessarely liczbą całkowitą od drgań w jednej sekundzie danych audio, więc sygnał reprezentowany jest nieciągły na styku dwóch buforów i wytwarza dziwny "tyk". Na przykład można ustawić mniej próbek, aby połączenie znajdowało się na końcu okresu sygnału.

  • Jak zauważył Paul R., najpierw należy skalibrować sprzęt, aby uzyskać niezawodną konwersję między wartością ustawioną w implementacji a dźwiękiem wytwarzanym przez urządzenie.W rzeczywistości próbki zmiennoprzecinkowe generowane w tym kodzie są w zakresie od -1 do 1, więc właśnie przekonwertowałem wartość amplitudy na dB (20 * log_10 (amplituda)).
  • Zobacz komentarze dotyczące innych szczegółów w implementacji i "znanych ograniczeń" (wszystkie te "DO ZROBIENIA"). Zastosowane funkcje są dobrze udokumentowane przez firmę Apple w ich odnośnikach.
+0

Nie działa dla mnie. Cisza. Lub nie rozumiem, jak korzystać z tego kodu. –

+0

@ValeriyVan Właśnie przetestowałem to i to działa. Połączone z AudioToolbox.framework, jednym widokiem i jednym przyciskiem, który wywołuje '[odtwarzanie dźwięku];'. Czy mógłbyś to sprecyzować? –

+0

Zbudowałem czysty projekt testowy, aby grać z tym i teraz działa. Ale brzeczki to te okresowe kliknięcia? Słyszę je zarówno w Symulatorze, jak i na prawdziwym urządzeniu. –

Powiązane problemy