'모종의 음모/noise cancelling'에 해당되는 글 12건

  1. 2010.05.01 wave multi channel order
  2. 2009.08.12 파형 뒤집어 플레이 하기 6
  3. 2009.08.12 WAVE format
  4. 2009.08.12 Active Noise Control - ANC
  5. 2009.04.01 WAVEFORMATEX structure
  6. 2009.03.30 음속
  7. 2009.03.26 waveInOpen() waveOutOpen()
  8. 2009.03.26 sampling rate 관련 의문 2
  9. 2009.03.26 wav format 관련 문서
  10. 2009.03.19 openGL audio spectrum visualization - sndpeek
MS 문서인데
wave file에서 멀티채널 사운드의 경우 채널의 순서에 대한 내용이다.
문득, wave 파일에서 left가 먼저일까 right가 먼저일까라는 의문이 들었는데
Left가 먼저이다.

Default Channel Ordering

The way to deterministically link channel numbers to speaker locations, thus providing consistency among multiple channel audio files, is to define the order in which the channels are laid out in the audio file. Several external standards define parts of the following master channel layout:

1.Front Left - FL
2.Front Right - FR
3.Front Center - FC
4.Low Frequency - LF
5.Back Left - BL
6.Back Right - BR
7.Front Left of Center - FLC
8.Front Right of Center - FRC
9.Back Center - BC
10.Side Left - SL
11.Side Right - SR
12.Top Center - TC
13.Top Front Left - TFL
14.Top Front Center - TFC
15.Top Front Right - TFR
16.Top Back Left - TBL
17.Top Back Center - TBC
18.Top Back Right - TBR

The channels in the interleaved stream corresponding to these spatial positions must appear in the order specified above. This holds true even in the case of a non-contiguous subset of channels. For example, if a stream contains left, bass enhance and right, then channel 1 is left, channel 2 is right, and channel 3 is bass enhance. This enables the linkage of multi-channel streams to well-defined multi-speaker configurations.

Warning: Content intended for the Low Frequency channel may not be rendered on the speaker that the data is sent to. This is because there is no way to guarantee the frequency range of the low frequency speaker in a user's system. For this reason, a speaker that is receiving low frequency audio might filter the frequencies that it cannot handle.

[링크 : http://www.microsoft.com/whdc/device/audio/multichaud.mspx]

[링크 : http://en.wikipedia.org/wiki/Surround_sound]

'모종의 음모 > noise cancelling' 카테고리의 다른 글

파형 뒤집어 플레이 하기  (6) 2009.08.12
WAVE format  (0) 2009.08.12
Active Noise Control - ANC  (0) 2009.08.12
WAVEFORMATEX structure  (0) 2009.04.01
음속  (0) 2009.03.30
Posted by 구차니
신기하다고 해야겠지만..
파형을 뒤집는다고 해서 소리가 달라지지 않는다라는 신기한 사실이 발견되었다.

당연히 뒤집으면 값이 달라지니, 주파수 쪽에서도 변동이 생길 것이고,
그러다 보면 당연히 일반적인 사람의 목소리가 아니거나 다른 소리로 변한걸이라고 생각했는데
그대로 나오는 현상이 있었다.

완전히 같은 위치는 아니지만
"in.wav"에서는 2채널에서는 파형이 나오는데 반해

"outout.wav"에서는 파형이 전혀 나오지 않음에도 불구하고 소리는 나온다.

왼쪽 파형을 뒤집어서 오른쪽에 덮어 씌운 결과물이 "output.wav"인데
왜 소리가 나오는지도 애매하다..

void main()
{
	short s16temp;
	FILE *fp;
	FILE *output;
	char filename[] = "in.wav";
	RIFF_HEADER riff;
	FMT_CHUNK fmt;
	DATA_CHUNK data;
	char *wave = NULL;
	unsigned int idx, maxloop;
	unsigned int ch_idx, ch_maxloop;

	fp = fopen(filename, "rb");
	output = fopen("output.wav","wb");
	fread(&riff, 1, sizeof(RIFF_HEADER), fp);
	fwrite(&riff, 1, sizeof(RIFF_HEADER), output);
		printf("riff.file_length[%d] bytes\n",riff.file_length);

	fread(&fmt, 1, sizeof(FMT_CHUNK), fp);
	fwrite(&fmt, 1, sizeof(FMT_CHUNK), output);
		printf("fmt.fmt_length[%d] bytes\n",fmt.fmt_length);
			printf("fmt.format[%d]\n",fmt.format);
			printf("fmt.channels[%d] channels\n",fmt.channels);
			printf("fmt.khz[%d] kHz\n",fmt.khz);
			printf("fmt.bps[%d] Bps\n",fmt.bps);
			printf("fmt.blockalign[%d] bytes/block\n",fmt.blockalign);
			printf("fmt.depth[%d] bits/sample\n",fmt.depth);

	fread(&data, 1, sizeof(DATA_CHUNK) - 4, fp);
	fwrite(&data, 1, sizeof(DATA_CHUNK) - 4, output);
		printf("data.data_length[%d]\n",data.data_length);
		printf("playtime %02d:%02d\n",
			data.data_length/fmt.bps/60,
			data.data_length/fmt.bps);
		printf("samples %02d\n",
			data.data_length/fmt.blockalign);

		wave = malloc(data.data_length);
		fread(wave, 1, data.data_length, fp);
	
		maxloop = data.data_length / 2;
		ch_maxloop = fmt.channels;
#if 1
		for(idx=0; idx < maxloop; idx+=fmt.channels)
		{
			memcpy(&s16temp, (short*)wave + idx + 1, fmt.depth / 8);
			fwrite(&s16temp, 1, fmt.depth / 8, output);

			if(s16temp == -65536)
			{
				s16temp = -65535;
			}
			s16temp = -s16temp;
			fwrite(&s16temp, 1, fmt.depth / 8, output);
		}
#endif
		free(wave);
	fclose(fp);
	fclose(output);
}

'모종의 음모 > noise cancelling' 카테고리의 다른 글

wave multi channel order  (0) 2010.05.01
WAVE format  (0) 2009.08.12
Active Noise Control - ANC  (0) 2009.08.12
WAVEFORMATEX structure  (0) 2009.04.01
음속  (0) 2009.03.30
Posted by 구차니
WAVE 파일은 RIFF / FMT / DATA chunk로 구성된다.
chunk는 데이터 덩어리 혹은 패킷이라고 생각하면 될 듯 하다.

아무튼 각 chunk에는 식별을 위한 MAGIC WORD가 있으나, 몇개의 파일만 확인해서
저 순서가 아닌 다른 순서로도 있는지는 확인하지 못하였다.
그냥 순서대로 읽어오면 된다.

typedef struct _RIFF_HEADER_
{
	unsigned char magic_RIFF[4];
	unsigned int file_length;
	unsigned char magic_WAVE[4];
} RIFF_HEADER;

typedef struct _FMT_CHUNK_
{
	unsigned char magic_FMT[4];
	unsigned int fmt_length;
	unsigned short format;
	unsigned short channels;
	unsigned int khz;	// sample rate
	unsigned int bps;	// bytes per second
	unsigned short blockalign;
	unsigned short depth;	// bits per sample
} FMT_CHUNK;

typedef struct _DATA_CHUNK_
{
	unsigned char magic_DATA[4];
	unsigned int data_length;
	unsigned char *data;
} DATA_CHUNK;

'모종의 음모 > noise cancelling' 카테고리의 다른 글

wave multi channel order  (0) 2010.05.01
파형 뒤집어 플레이 하기  (6) 2009.08.12
Active Noise Control - ANC  (0) 2009.08.12
WAVEFORMATEX structure  (0) 2009.04.01
음속  (0) 2009.03.30
Posted by 구차니
능동 소음 제어는, 들어오는 소리의 반대파형을 출력함으로
소음을 사라지게 하는 기술이다.


[링크 : http://www.themotorreport.com.au/5928/toyota-to-fit-active-noise-cancelling-to-crown-hybrid/]

[링크 : http://en.wikipedia.org/wiki/Active_noise_control]

'모종의 음모 > noise cancelling' 카테고리의 다른 글

파형 뒤집어 플레이 하기  (6) 2009.08.12
WAVE format  (0) 2009.08.12
WAVEFORMATEX structure  (0) 2009.04.01
음속  (0) 2009.03.30
waveInOpen() waveOutOpen()  (0) 2009.03.26
Posted by 구차니
typedef struct 
{
	WORD wFormatTag;
	WORD  nChannels;
	DWORD nSamplesPerSec;
	DWORD nAvgBytesPerSec;
	WORD  nBlockAlign;
	WORD  wBitsPerSample;
	WORD  cbSize;
} WAVEFORMATEX;

wFormatTag

Waveform-audio format type. Format tags are registered with Microsoft Corporation for many compression algorithms. A complete list of format tags can be found in the Mmreg.h header file. For one- or two-channel PCM data, this value should be WAVE_FORMAT_PCM. When this structure is included in a WAVEFORMATEXTENSIBLE structure, this value must be WAVE_FORMAT_EXTENSIBLE.


nChannels

Number of channels in the waveform-audio data. Monaural data uses one channel and stereo data uses two channels.


nSamplesPerSec

Sample rate, in samples per second (hertz). If wFormatTag is WAVE_FORMAT_PCM, then common values for nSamplesPerSec are 8.0 kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz. For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.


nAvgBytesPerSec

Required average data-transfer rate, in bytes per second, for the format tag. If wFormatTag is WAVE_FORMAT_PCM, nAvgBytesPerSec should be equal to the product of nSamplesPerSec and nBlockAlign. For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.


nBlockAlign

Block alignment, in bytes. The block alignment is the minimum atomic unit of data for the wFormatTag format type. If wFormatTag is WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE, nBlockAlign must be equal to the product of nChannels and wBitsPerSample divided by 8 (bits per byte). For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.

Software must process a multiple of nBlockAlign bytes of data at a time. Data written to and read from a device must always start at the beginning of a block. For example, it is illegal to start playback of PCM data in the middle of a sample (that is, on a non-block-aligned boundary).


wBitsPerSample

Bits per sample for the wFormatTag format type. If wFormatTag is WAVE_FORMAT_PCM, then wBitsPerSample should be equal to 8 or 16. For non-PCM formats, this member must be set according to the manufacturer's specification of the format tag. If wFormatTag is WAVE_FORMAT_EXTENSIBLE, this value can be any integer multiple of 8 and represents the container size, not necessarily the sample size; for example, a 20-bit sample size is in a 24-bit container. Some compression schemes cannot define a value for wBitsPerSample, so this member can be 0.


cbSize

Size, in bytes, of extra format information appended to the end of the WAVEFORMATEX structure. This information can be used by non-PCM formats to store extra attributes for the wFormatTag. If no extra information is required by the wFormatTag, this member must be set to 0. For WAVE_FORMAT_PCM formats (and only WAVE_FORMAT_PCM formats), this member is ignored. When this structure is included in a WAVEFORMATEXTENSIBLE structure, this value must be at least 22.


Remarks

An example of a format that uses extra information is the Microsoft Adaptive Delta Pulse Code Modulation (MS-ADPCM) format. The wFormatTag for MS-ADPCM is WAVE_FORMAT_ADPCM. The cbSize member will typically be set to 32. The extra information stored for WAVE_FORMAT_ADPCM is coefficient pairs required for encoding and decoding the waveform-audio data.



[링크 : http://msdn.microsoft.com/en-us/library/ms713497(VS.85).aspx]

'모종의 음모 > noise cancelling' 카테고리의 다른 글

WAVE format  (0) 2009.08.12
Active Noise Control - ANC  (0) 2009.08.12
음속  (0) 2009.03.30
waveInOpen() waveOutOpen()  (0) 2009.03.26
sampling rate 관련 의문  (2) 2009.03.26
Posted by 구차니
소리의 속도로 항상 고정된 값이 아닌 매질의 영향을 받는다.
1기압, 0도 에서 331.5m/s 이고 1도당 0.6m/s 증가


[링크  : http://enc.daum.net/dic100/contents.do?query1=b17a2486a]




뜬금없이 이녀석이 왜 있냐면은~!
sampling시에는 샘플링이 완료 된 후 데이터가 넘겨지기 때문에,
과거 시점의 파장이 녹음되어 있게 된다. 그렇기에 빛의 속도에 근접하게 전송되는 전기신호에 의해서
처리속도, sampling 속도 등을 감안해서 어느정도 거리에서 출력을 해주는 약간의 보정이 필요 하지 않을까? 라는
생각이 들어서 찾아 본것이다. (머 그렇다고 -ㅁ-)


44050Hz(=44kHz)에서 샘플링시 1회 샘플링 할 동안 소리가 진행하는 거리

1/44050*331.5(m) = 0.0075255391600454029511918274687855m
7.5255391600454029511918274687855mm >= 7.52mm

만약
플레이시에 딜레이가 없고,
반대파장을 만들어 내는데 시간이 걸리지 않는다고 가정하고,
전기가 흐르는 속도가 무한대라서 전파속도가 0라고 가정하고,
순수하게 녹음에 대한 딜레이만 존재한다고 할 때 스피커와 마이크는 대략 1cm 정도의 간격이 필요 하다
(다르게 말하면, 변환에 필요한 시간, 신호전달 시간을 감안하면 1cm 이상의 거리를 벌려놔야지
반대파장으로 소리가 중화될 수 있을 것으로 보인다)

'모종의 음모 > noise cancelling' 카테고리의 다른 글

Active Noise Control - ANC  (0) 2009.08.12
WAVEFORMATEX structure  (0) 2009.04.01
waveInOpen() waveOutOpen()  (0) 2009.03.26
sampling rate 관련 의문  (2) 2009.03.26
wav format 관련 문서  (0) 2009.03.26
Posted by 구차니
MCI 함수들을 찾다 보니 두개의 함수가 눈에 띄었다.
waveInOpen()
waveOutOpen()

MCI 함수중에 이녀석이 눈에 띈 이유는, wave를 받아오고 보내주는 장치를 열수 있을 가능성이 있어 보여서였다.
그래서 이 함수들로 검색을 해보니 조금 나오긴한다..

"소프트웨어 오디오 코덱 low-level document" 라는
유용한 문서가 발견되었는데, 출처가 불분명해서 출처를 추적해보았는데 이래저래 원본이 보이지 않는다.
아무튼 그나마 근접해 보이는 것은

볼랜드 포럼 글에서 발견한
자세한 것은 아래 "소프트웨어 오디오 코덱 low-level document"를 참조하세요.
  http://netbeta.sogang.ac.kr/%7Esuchduck/audio_low.html 라는 글인데.. 이 링크는 깨져있다..

결론은 아쉽게도 발견 실패




대충 훑어봐서 자세한 내용은 다시 읽어 봐야겠지만,
아무래도 166Mhz 시절에 쓴글이라 지금에는 어느정도 커버할 수 있을지는 몰라도,
네트워크를 통한 화상채팅에 대한 내용으로, 네트워크 전송의 부하로 인해서 어느정도 크기로 한번에 보낸다는 의미이다.
그리고 윈도우 메시지 기반으로 작동하기에, 실시간으로 하기에는 힘들지 않을까라는 생각도 든다.

'모종의 음모 > noise cancelling' 카테고리의 다른 글

WAVEFORMATEX structure  (0) 2009.04.01
음속  (0) 2009.03.30
sampling rate 관련 의문  (2) 2009.03.26
wav format 관련 문서  (0) 2009.03.26
openGL audio spectrum visualization - sndpeek  (0) 2009.03.19
Posted by 구차니
문득 22KHz로 샘플링된 wav 파일 헤더를 분석하다 의문에 빠졌다.

22KHz라면 현실세계는 1000Hz = 1KHz 니까 22000Hz가 되어야 하는데
실제로 들어 있는 값은 22050Hz 이다. 오잉?

검색해보니
11KHz는 11025Hz
22KHz는 22050Hz
44KHz는 44100Hz
란다.


이유? 모른다 -ㅁ-

Although I've mentioned the period as being the duration of one cycle of a sound wave, it is also used to describe the duration of one sample. For example, at 22kHz, the period of each sample is 1/22050s = 0.000045351 seconds (Note that 22kHz rarely equals 22000Hz. A 22kHz sound system would typically run at 22050Hz, and it is only written as 22kHz as a matter of convenience. Similarly 11kHz is 11025Hz and 44kHz is 44100Hz). This means that, every 0.00045351 seconds, the sound hardware reads a sample from the sound buffer, converts it to a voltage, and sends it to the speaker.

[참고 : http://www.iconbar.com/comments/rss/news1209.html]

An audio CD can represent frequencies up to 22.05 kHz, the Nyquist frequency of the 44.1 kHz sample rate.

[출처 : http://en.wikipedia.org/wiki/Red_Book_(audio_CD_standard)]

The audio CD has a specified bandwidth ceiling of 20kHz, leaving a small gap between that upper frequency and half the sampling rate which is 22.05kHz. The filter must be very steep (high order) to remove information above 22.05kHz but still leaving information under 20kHz. Such a filter was developed at the inception of CD playback and was named the "brickwall filter". This filter had a terrible impact on sound quality.

[출처 : http://www.simaudio.com/edu_upsampling.htm]

An audio frequency (abbreviation: AF), or audible frequency is characterized as a periodic vibration whose frequency is audible to the average human. While the range of frequencies that any individual can hear is largely related to environmental factors, the generally accepted standard range of audible frequencies is 20 to 20,000 hertz. Frequencies below 20 Hz can usually be felt rather than heard, assuming the amplitude of the vibration is high enough. Frequencies above 20,000 Hz can sometimes be sensed by young people, but high frequencies are the first to be affected by hearing loss due to age and/or prolonged exposure to very loud noises.

[출처 : http://en.wikipedia.org/wiki/Audio_frequency]


아마도.. 추측성 발언이긴 하지만,
인간의 가청주파수 영역이 20Hz ~ 20000Hz(20KHz) 인데,
다른 주파수와의 gap을 위해 약간의 간격을 더 주어서 22.05kHz를 CD의 기본 주파수로 한 것 같다.
물론 나이키스트 이론(Nyquist Theroy)에 의해서 최대 주파수의 2배로 샘플링을 해야 하므로 44.1kHz가 된 것이고 말이다.

'모종의 음모 > noise cancelling' 카테고리의 다른 글

음속  (0) 2009.03.30
waveInOpen() waveOutOpen()  (0) 2009.03.26
wav format 관련 문서  (0) 2009.03.26
openGL audio spectrum visualization - sndpeek  (0) 2009.03.19
MCI Reference  (2) 2009.03.19
Posted by 구차니

'모종의 음모 > noise cancelling' 카테고리의 다른 글

waveInOpen() waveOutOpen()  (0) 2009.03.26
sampling rate 관련 의문  (2) 2009.03.26
openGL audio spectrum visualization - sndpeek  (0) 2009.03.19
MCI Reference  (2) 2009.03.19
소음제거 프로그램  (0) 2009.03.16
Posted by 구차니
sndpeek :
real-time audio visualization

sndpeek is just what it sounds (and looks) like:

  • real-time 3D animated display/playback
  • can use mic-input or wav/aiff/snd/raw/mat file (with playback)
  • time-domain waveform
  • FFT magnitude spectrum
  • 3D waterfall plot
  • lissajous! (interchannel correlation)
  • rotatable and scalable display
  • freeze frame! (for didactic purposes)
  • real-time spectral feature extraction (centroid, rms, flux, rolloff)
  • available on MacOS X, Linux, and Windows under GPL
  • part of the sndtools distribution.


기침소리의 스펙트럼 OTL

openGL 기반이고, 각종 플랫폼에서 사용이 가능한(Win/Linux/Mac) 버전이다.
sndpeek는 rt_lnc의 부분이라고 한다. 아무튼, 이 녀석을 분석하면 내가 원하는 실시간 변형도 가능하려나...

README 내용중 발췌

supported platforms:
  - MacOS X (CoreAudio)
  - Linux (ALSA/OSS/Jack)
  - Windows/Cygwin (DirectSound)

그리고 라이센스는 GPL 이다.(홈페이지에는 기재가 되어있지 않고, 소스 파일에 GPL 문서가 들어있다.)

[공식 : http://soundlab.cs.princeton.edu/software/sndpeek/]
[상위 : http://soundlab.cs.princeton.edu/software/rt_lpc/]

'모종의 음모 > noise cancelling' 카테고리의 다른 글

waveInOpen() waveOutOpen()  (0) 2009.03.26
sampling rate 관련 의문  (2) 2009.03.26
wav format 관련 문서  (0) 2009.03.26
MCI Reference  (2) 2009.03.19
소음제거 프로그램  (0) 2009.03.16
Posted by 구차니