频率调制合成算法

根据我阅读,我已经取得了FM声音合成的算法。 我不知道如果我这样做是正确的。 在创建软件合成仪的函数被用来产生振荡器和调制器可用于模块本振荡器的频率。 我不知道是否FM合成被认为仅工作,用于调制的正弦波?

该算法采用仪器波函数和频率调制器调制指数和比例。 对于每个注意它需要的频率,并存储为载体和调制器振荡器的相位值。 调制器总是使用正弦波。

这是伪代码算法:

function ProduceSample(instrument, notes_playing) for each note in notes_playing if note.isPlaying() # Calculate signal if instrument.FMIndex != 0 # Apply FM FMFrequency = note.frequency*instrument.FMRatio; # FM frequency is factor of note frequency. note.FMPhase = note.FMPhase + FMFrequency / kGraphSampleRate # Phase of modulator. frequencyDeviation = sin(note.FMPhase * PI)*instrument.FMIndex*FMFrequency # Frequency deviation. Max deviation is a factor of the FM frequency. Modulation is done by a sine wave. note.phase = note.phase + (note.frequency + frequencyDeviation) / kGraphSampleRate # Adjust phase with deviation # Reset the phase value to prevent the float from overflowing if note.FMPhase >= 1 note.FMPhase = note.FMPhase - 1 end if else # No FM applied note.phase = note.phase + note.frequency / kGraphSampleRate # Adjust phase without deviation end if # Calculate the next sample signal = signal + instrument.waveFunction(note.phase,instrument.waveParameter)*note.amplitude # Reset the phase value to prevent the float from overflowing if note.phase >= 1 note.phase = note.phase - 1 end if end if end loop return signal end function

因此,如果音符的频率是在100Hz时,FMRatio被设定在0.5和FMIndex是0.1它应产生频率在50Hz的周期95Hz和105Hz之间去。 这是做它的正确途径。 我的测试表明,它并不总是好听,调节锯和方波时尤其如此。 它是确定以调节锯和方波这样还是只有正弦波?

这是C和CoreAudio的实施:

static OSStatus renderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData){ AudioSynthesiser * audioController = (AudioSynthesiser *)inRefCon; // Get a pointer to the dataBuffer of the AudioBufferList AudioSampleType * outA = (AudioSampleType *) ioData->mBuffers[0].mData; if(!audioController->playing){ for (UInt32 i = 0; i < inNumberFrames; ++i){ outA[i] = (SInt16)0; } return noErr; } Track * track = &audioController->tracks[inBusNumber]; SynthInstrument * instrument = (SynthInstrument *)track; float frequency_deviation; float FMFrequency; // Loop through the callback buffer, generating samples for (UInt32 i = 0; i < inNumberFrames; ++i){ float signal = 0; for (int x = 0; x < 10; x++) { Note * note = track->notes_playing[x]; if(note){ //Envelope code removed //Calculate signal if (instrument->FMIndex) { //Apply FM FMFrequency = note->frequency*instrument->FMRatio; //FM frequency is factor of note frequency. note->FMPhase += FMFrequency / kGraphSampleRate; //Phase of modulator. frequency_deviation = sinf(note->FMPhase * M_PI)*instrument->FMIndex*FMFrequency; //Frequency deviation. Max deviation is a factor of the FM frequency. Modulation is done by a sine wave. note->phase += (note->frequency + frequency_deviation) / kGraphSampleRate; //Adjust phase with deviation // Reset the phase value to prevent the float from overflowing if (note->FMPhase >= 1){ note->FMPhase--; } }else{ note->phase += note->frequency/ kGraphSampleRate; //Adjust phase without deviation } // Calculate the next sample signal += instrument->wave_function(note->phase,instrument->wave_parameter)*track->note_amplitude[x]; // Reset the phase value to prevent the float from overflowing if (note->phase >= 1){ note->phase--; } } //Else nothing added } if(signal > 1.0){ signal = 1; }else if(signal < -1.0){ signal = -1.0; } audioController->wave[audioController->wave_last] = signal; if (audioController->wave_last == 499) { audioController->wave_last = 0; }else{ audioController->wave_last++; } outA[i] = (SInt16)(signal * 32767.0f); } return noErr; }

答案是非常赞赏。

--------------解决方案-------------

好问题,我会尽力提供一些想法/想法...

要回答你的主要问题,是的,它是绝对精细调节比正弦波其他波形。 事实上,这是FM是最擅长的。 调制正弦波给人一种很无聊的环绕输出,但是当你输入更复杂的波形与相同的调制,你得到更多有趣的结果。 FYI(如果你不知道的),最有名的FM合成器可能是雅马哈DX7这是在它的天革命性的(也是第一个曾经与MIDI合成器)。

另外要提的是,FM合成器是如此进行数字化产生的波形,因此使用更复杂的波形正弦比/平方米/三角波创造了有趣的声音数字化时代的开始。 这可能是你需要做什么,以获得更好的声音 - 而不只是产生一个正弦波调制,使用复杂的波形。

通过您的代码看,它看起来像你做正确的FM。 不过,我认为调制频率通常是固定的,而不是音符频率的一小部分,因为它是在你的代码。 这可能是值得尝试这一点,看它是否听起来更像是你在找什么。

我希望帮助一点点。

最后,我决定使用相位调制。 我发现许多合成器使用,即使他们都标有FM相位调制。

这是很容易实现:

signal += wave_function(note_phase * note_frequency / sample_rate + fm_index * sin(note_phase * fm_frequency * pi / sample_rate))*note_amplitude

红眼睛:

要回答你的主要问题,是的,它是绝对精细调节比正弦波其他波形。 事实上,这是FM是最擅长的。 调制正弦波给人一种很无聊的环绕输出,但是当你输入更复杂的波形与相同的调制,你得到更多有趣的结果。

这充其量是过于简单化,可能完全是假的。 调制正弦波正弦波是完全有能力创造一个广泛的复杂和不“无聊”的声音。

相反,复杂波形相乘大规模产生边带的数目和使可预测的结果更难以实现。 这实际上是在许多常见的情况下,几乎相当于相位调制(PM)包括“”“FM”雅马哈 - - 只关注正弦波约FM大多数文档。

FYI(如果你不知道的),最有名的FM合成器可能是雅马哈DX7这是在它的天革命性的(也是第一个曾经与MIDI合成器)。

另外要提的是,FM合成器是如此进行数字化产生的波形,因此使用更复杂的波形正弦比/平方米/三角波创造了有趣的声音数字化时代的开始。“

这是毫无疑问的完全错误的。 在DX7和许多早期的FM - 在现实中,PM - 合成器雅马哈仅提供正弦波,然而,正如我上面所指出的,他们尚能很多,很多非“无聊”的声音。 没有“更复杂的波形,”参与。

后来才雅马哈添加其他的波形,并与由正弦波产生的边带的可预测性的时候,作为我上述的效用是有些怀疑。

这可能是你需要做什么,以获得更好的声音 - 而不只是产生一个正弦波调制,使用复杂的波形“

或者只是使用正弦波具有很好的安排和参数(比例,指数等)的组合

或者只是类似物状 - - 对于许多用户的结果并不任何表明它是不能这样做的,与正弦波FM / PM不会立即产生演播室质量这一事实。

分类:C# 时间:2012-01-01 人气:0
分享到:

相关文章

  • 关于核心音频API为Windows 7 2013-02-21

    您好微软技术团队, 我想知道如果任何机会,它有可能改变音频采样率动态核心音频API中的Windows 7.如果可能的话,可以请你能告诉我们如何能做到这一点的C ++应用程序. 感谢和关于下述 SAURABH塔瓦 --------------解决方案------------- 嗨, 你已经张贴的问题是比较复杂的比微软通常回答答案论坛. 我建议你​​张贴在MSDN论坛同样为更好的援助: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/t

  • 核心音频在iPhone上 - 任何方法来改变麦克风增益(无论是免提麦克风或耳机麦克风)? 2012-09-26

    经过一番搜索答案似乎是否定的,但我想放弃之前我会问这里. 对于一个项目,我的工作,包括录制的声音时,输入电平听起来有点安静时,双方的路线是外部麦克风+扬声器时,它的耳机麦克风+耳机. 没有人知道明确是否有可能以编程方式更改任何部分核心音频的iPhone上的麦克风增益电平? 如果不是,是有可能,我不是真的在"免提"模式(与外部麦克风至少),但只觉得我是谁? 这是我的音频会话初始化代码: OSStatus error = AudioSessionInitialize(NULL, NULL,

  • iOS的:音频单元VS OpenAL的VS核心音频 2013-08-30

    可能有人向我解释的OpenAL如何适应有声的iPhone上的架构? 似乎有API的不同层次来处理声音. 等级越高的是很容易理解的. 但我的理解变得明朗朝下方. 有核心音频,音频单元,OpenAL的. 什么是它们之间的联系? 是的OpenAL的底层,在其掌握核心音频(包含作为其较低级别的对象之一的Audio Units)? 的OpenAL似乎并没有被Xcode中进行记录,但我可以运行使用它的功能代码. --------------解决方案------------- 这是我想通了: 在底层是核心音频

  • Xcode中,核心音频:我如何航线从线路输出到应用程序的声音? 2012-03-05

    我需要一台Mac应用程序,抓取音频要去争边球和渲染到内存. 是否有可能与核心音频做到这一点,如果是的话是在足够高的水平,仅仅做到这一点还是做我需要做的像soundflower,并创建一个虚拟声音设备. 你知道任何参考在哪儿能买到这样做我自己. --------------解决方案------------- 你可以使用JACK - 只要写一个程序,任何你想进去一个插孔输入,运行qjackctl和管道. 这会给你不仅仅是在看线路输出更多的控制,不知道这是否是理想的或不适合你.

  • iPhone SDK的:核心音频如何继续记录用户通过退出该应用程序将停止录制后的文件,然后重新打开它? 2012-03-24

    iPhone的AVAudioRecorder类将不会允许你打开一个现有的文件继续录音. 相反,它会覆盖它. 我想知道,让我使用的核心音频API来继续录制到现有文件的方法. --------------解决方案------------- 最好的办法是去看看在音频队列服务的API. 这基本上是下一个"更深"的水平为苹果公司提供的核心音频堆栈. 不幸的是,AVAudioRecorder和音频队列服务之间的差距是巨大的. AQS是一个基于C的API和更加"原始"最低的Cor

  • windows核心音频API + WaveOutXxx API 2012-05-25

    我写波一个代码来播放WAV文件. 我使用的是WavOutxxx API来实现这一目标. 这是有据可查的WavOutXxx的API开放其流的默认会话. 现在因为某些原因我想控制使用IAudioSessionControl API(windows核心音频接口)的WaveOutXxx的API宣布会议开幕. 你能告诉我,如果这确实是可能的? 我的代码不涉及此一进程间的通信,因为一切都在相同的代码来处理. MSDN说,这是可能的(http://msdn.microsoft.com/en-us/librar

  • 核心音频AudioBuffer MDATA 2012-07-07

    我想了解有关处理iOS上的音频和我一直在阅读关于苹果的开发者页面很多. 不过,我已经达到了一个点,我有一个AudioBuffer,我不知道该怎么办. 我知道它包含一个MDATA缓冲区,但我不知道它包含. 我环顾四周什么是"音频数据的缓冲,"作为参考描述它,但我似乎仍然不明白那是什么. 而且,MDA​​TA似乎是void类型,我想,可以浇铸成所含的特定音频的类型. 我想我不能确定怎么知道以什么作为或者施放此. --------------解决方案------------- 你不需要投它.

  • 麻烦联添Bolstad的核心音频实例 2013-03-14

    我可能失去了一些东西简单,但我越来越试图建立时,下面的链接器错误: Undefined symbols for architecture i386: "CAStreamBasicDescription::CAStreamBasicDescription()", referenced from: -[AudioController initializeAUGraph] in AudioController.o -[AudioController .cxx_construct] in Au

  • AVAssetWriterInput可以通过核心音频直播音频? 2013-04-29

    我期待,以适应AVFoundation做一些事情,似乎应该是可能的,但我找不到任何支持或实例.我的方案的任何地方. 我需要从前置摄像头抓取视频,并结合,与我从Core Audio的音频来. 我有代码的工作,解决了从摄像头抓取视频和组合与来自麦克风的音频常见的情况,它的伟大工程. 这主要是改编自RosyWriter苹果的示例代码. 不过,我找不到任何方式使用的音频现身核心音频的实时数据流,创建一个AVAssetWriterInput出来,并把它添加作为输入我的AVCaptureSession. 我

  • 合并CAF(核心音频格式,线性PCM)文件导入视频(MJPEG)文件中使用的ffmpeg(编程) 2013-05-03

    正如标题所说,我有一个CAF文件,我想使用的ffmpeg(编程)使用C.以插入文件转换成视频文件 CAF文件具有线性PCM音频格式 我成功地能够建立视频文件,现在想将音频添加到从CAF(核心音频格式)文件中的视频文件. 任何人都可以提供样品,请. 谢谢 --------------解决方案------------- FFmpeg的不具有编码器CAF文件. 到音频添加到视频,核心音频格式中线性PCM编码可以被当作一个wav文件! 换句话说,CAF文件+线性PCM编码可以被当作原始音频文件,并且可以

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.654 (s). 10 q(s)