OpenAL Lesson 7: The Doppler Effect(转载)

转载 2007年10月14日 20:35:00


I know this will be boring review for anyone with a course in high school physics, but lets humour ourselves. The Doppler effect can be a very tricky concept for some people, but it is a logical process, and kind of interesting when you get right down to it. To begin understanding the Doppler effect we first must start to understand what a "sound" really is. Basically a sound is your minds interpretation of a compression wave that is traveling through the air. Whenever the air becomes disturbed it starts a wave which compresses the air particles around it. This wave travels outward from it's point of origin. Consider the following diagram.

In this diagram (on the left) the big red "S" stands for the sources position, and the big red "L" stands for (you guessed it), the Listener's position. Both source and Listener are not moving. The source is emitting compression waves outward, which are represented in this diagram by the blue circles. The Listener is experiencing the sound exactly as it is being made in this diagram. The Doppler effect is not actually present in this example since there is no motion; the Doppler effect only describes the warping of sound due to motion.

What you should try to do is picture this diagram animated. When the source emits a wave (the circles) it will look as though it is growing away from it's point of origin, which is the sources position. A good example of a similar effect is the ripples in a pond. When you throw a pebble into a calm body of water it will emit waves which constantly move away from the point of impact. Believe it or not this occurs from the exact same physical properties. But what does this have to do with the Doppler effect? Check out the next diagram (on the right).

Wow, what's going on here? The source is now in motion, indicated by the little red arrow. In fact the source is now moving towards the Listener with an implied velocity. Notice particularly that the waves (circles) are being displaced inside each other. The displacement follows the approximate path of the source which emits them. This is the key to the Doppler effect. Essentially what has happened is that the source has emitted a wave at different points in it's path of travel. The waves it emits do not move with it, but continue on their own path of travel from the point they were emitted.

So how does this effect the perceived sound by the Listener? Well, notice too in the last diagram that the waves (circles) that are between the source and the Listener are kind of compressed together. This will cause the sound waves to run together, which in turn causes the perceived sound seem like it's faster. What we are talking about here is frequency. The distances between the waves effects the frequency of the sound. When the source that emits the sound is in motion, it causes a change in frequency. You may notice too that distance between the waves varies at different points in space. For example, on the opposite side of the moving source (anywhere along the previous path of travel) the distances are actually wider, so the frequency will be lower (the distance and frequency have an inverse relationship). What this implies is that the frequency perceived by the Listener is relative to where the Listener is standing.

The motion of the Listener can also affect the frequency. This one is a little harder to picture though. If the source is still, and the Listener is moving toward the source, then the perceived frequency by the Listener will be warped in the same exact manner that we described for the moving source.

If you still have trouble picturing this, consider the following two diagrams:


These two diagrams will represent the sound in the form of a sine wave. Look at the first one. Think of the peaks as the instance of the wave. The very top point of the wave will be the same as the instance of the blue circle in the previous set of diagrams. The valleys will be like the spaces in between the blue circles. The second diagram represents a compressed wave. When you compare the two you will notice an obvious difference. The second diagram simply has more wave occurrences in the same amount of space. Other ways of saying this are that they occur more often, with a greater regularity, or with a greater frequency.

For anyone who is interested in some added information: The velocity of the waves is the speed of sound. If the velocity of the source is greater than that of the wave, then the source is breaking the sound barrier.

The Physics of OpenAL

Ok, either you have understood my ramblings on the Doppler effect from above, or you have skipped it because you already have full knowledge of the Doppler effect and just want to know how it effects the OpenAL rendering pipeline. I think the best start to his section will be to quote the OpenAL spec directly:

"The Doppler Effect depends on the velocities of Source and Listener relative to the medium, and the propagation speed of sound in that medium." - chapter 3, subsection 7"

We can take this to mean that there are 3 factors which are going to affect the final frequency of the sound heard by the Listener. These factors are the velocity of the source, the velocity of the Listener, and a predefined speed of sound.

When we refer to a "medium", what we mean is the kind of material that both the source and Listener are "in". For example, sounds that are heard from underwater are much different than sounds that are heard in the open air. Air and water are examples of different mediums. The reason that sound is so different between these mediums has to do with the particle density. As we said before, sound is nothing but the motion of particles in the air. In a medium with a much greater particle density the sound will be much different because the particles are in closer contact. When they are in closer contact it allows for the wave to travel much better. As an example of the opposite, think of outer space. In outer space there is an extremely low particle density. In fact there is only a few very light particles (mostly hydrogen) scattered about. This is why no sound can be heard from space.

Ok, lets get back on topic. OpenAL calculates the Doppler effect internally for us, so we need only define a few parameters that will effect the calculation. We would do this in case we don't want a realistic rendering. Rather if want to exaggerate or deemphasize the effect. The calculation goes like this.

    shift = DOPPLER_FACTOR * freq * (DOPPLER_VELOCITY - l.velocity) / (DOPPLER_VELOCITY + s.velocity)

Constants are written in all caps to differentiate. The "l" and "s" variables are the Listener and source respectively. "freq" is the initial unaltered frequency of the emitting wave, and "shift" is the altered frequency of the wave. The term "shift" is the proper way to address the altered frequency and will be used from now on. This final shifted frequency will be sampled by OpenAL for all audio streaming that is affected.

We already know that we can define the velocity of both source and Listener by using the 'AL_VELOCITY' field to 'alListenerfv' and 'alSourcefv'. The 'freq' parameter comes straight from the buffer properties when it was loaded from file. To set the constant values the following functions are provided for us.

ALvoid alDopplerFactor(ALfloat factor);
ALvoid alDopplerVelocity(ALfloat velocity);

For 'alDopplerFactor' any non-negative value will suffice. Passing a negative value will raise an error of 'AL_INVALID_VALUE', and the whole command will be ignored. Passing zero is a perfectly valid argument. Doing this will disable the Doppler effect and may in fact help overall performance (but won't be as realistic). The effect of the Doppler factor will directly change the magnitude of the equation. A value of 1.0 will not change the effect at all. Passing anything between 0.0 and 1.0 will minimize the Doppler effect, and anything greater than 1.0 will maximize the effect.

For 'alDopplerVelocity' any non-negative non-zero value will suffice. Passing either a negative or a zero will raise an error of 'AL_INVALID_VALUE', and the whole command will be ignored. The Doppler velocity is essentially the speed of sound. Setting this will be like setting how fast sound can move through the medium. OpenAL has no sense of medium, but setting the velocity will give the effect of a medium. OpenAL also has no sense of units (kilometer, miles, parsecs), so keep that in mind when you set this value so it is consistent with all other notions of units that you have defined.



因为之前在原公司上班的时候,用过openAL来播放PCM实时数据流.现在换了新公司又要求我用自己的方法写个音频播放器.我就选用这openAL H-,RzL/   但是这次使用openAL的时候,就...
  • xiaojun111111
  • xiaojun111111
  • 2015年03月05日 16:47
  • 600


不使用alut,只使用openal播放WAV文件: #include #include struct WAVE_Data { char subChunkID[4]; //should con...
  • u011417605
  • u011417605
  • 2015年11月05日 18:48
  • 1198


OpenAL(Open Audio Library)是自由软件界的跨平台音效API。它设计给多通道三维位置音效的特效表现。其 API 风格模仿自 OpenGL。刚开始接触的时候可以下载工具包Alut,...
  • T20091
  • T20091
  • 2013年11月29日 19:04
  • 1829


使用OpenAL和FFMPEG解码并播放音乐OpenAL是一个开源的音效库,然而这里只用它来播放音乐。 FFMPEG负责把音乐解码并转换成指定的编码和采样率,然后送到OpenAL中播放。 (已在w...
  • beichen2012
  • beichen2012
  • 2017年03月10日 11:18
  • 752


1. 前言前面的文章讲了如何使用OpenAL对音频添加音效,并播放,参见: OpenAL 使用基本流程 使用OpenAL混音,添加音频特效本文谈谈如何对音频进行渲染,然后存储下来。2. 初始化初始...
  • xiyanlgu
  • xiyanlgu
  • 2016年12月17日 11:24
  • 876

【DirectX11】第四篇 Effects框架

本文为转载文章,这里为原文链接。本文索引:一 什么是Effects 二 Effect文件结构 1 technique11 2 pass 三 如何编译着色器 四 如何创建Effect对象 五 如何使Ef...
  • xueyedie1234
  • xueyedie1234
  • 2016年05月09日 19:50
  • 3158


  • stonesing
  • stonesing
  • 2016年08月25日 17:07
  • 2085

sqli labs通关秘籍

lession 5子查询Select concat((select database()));注意不要写错。上述查询中,红色部分就是子查询,它会首先被评估。rand()函数随机生成0-1之间的一个数:...
  • sinat_25449961
  • sinat_25449961
  • 2016年06月17日 11:14
  • 698


转载地址: 1、找到要转载的文章,用chrome浏览器打开,右键选择审查元...
  • dlhlSC
  • dlhlSC
  • 2016年08月19日 16:51
  • 5051


个人对openAL的看法 因为之前在原公司上班的时候,用过openAL来播放PCM实时数据流.现在换了新公司又要求我用自己的方法写个音频播放器.我就选用这openAL  但是这次使用openAL的时候...
  • langsim
  • langsim
  • 2014年08月18日 18:31
  • 1109
您举报文章:OpenAL Lesson 7: The Doppler Effect(转载)