मिनिमल सी ऑडियो पीढ़ी उदाहरण
नीचे दिए गए उदाहरण कच्चे प्रारूप में एक शुद्ध 1000k हर्ट्ज साइनस उत्पन्न करता है। साथ
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(void) {
FILE *f;
const double PI2 = 2 * acos(-1.0);
const double SAMPLE_FREQ = 44100;
const unsigned int NSAMPLES = 4 * SAMPLE_FREQ;
uint16_t ampl;
uint8_t bytes[2];
unsigned int t;
f = fopen("out.raw", "wb");
for (t = 0; t < NSAMPLES; ++t) {
ampl = UINT16_MAX * 0.5 * (1.0 + sin(PI2 * t * 1000.0/SAMPLE_FREQ));
bytes[0] = ampl >> 8;
bytes[1] = ampl & 8;
fwrite(bytes, 2, sizeof(uint8_t), f);
}
fclose(f);
return EXIT_SUCCESS;
}
खेल::
sudo apt-get install ffmpeg
ffplay -autoexit -f u16be -ar 44100 -ac 1 out.raw
पैरामीटर पर विस्तार से बताया: https://superuser.com/a/1063230/128124
उबंटू 15.10 पर परीक्षण किया गया 44.1kHz नमूना दर पर, यह 4 सेकंड तक चलेगा। एक सरल कैनन synth सहित fun examples on GitHub।
भौतिकी
ऑडियो समय में हर पल के लिए एक एकल संख्या के रूप में एन्कोड किया गया है। उस वीडियो की तुलना करें, जिसमें समय में प्रति मिनट WIDTH * HEIGHT संख्या की आवश्यकता होती है।
इसके बाद यह संख्या अपने स्पीकर की diaphragm के रैखिक विस्थापन में बदल जाती है:
| /
|/
|-/
| | A I R
|-\
| \
| \
<-> displacement
| /
| /
|---/
| | A I R
|---\
| \
| \
<---> displacement
| /
| /
|-----/
| | A I R
|-----\
| \
| \
<-----> displacement
विस्थापन पीछे और आगे हवा धक्का, दबाव मतभेद है, जो P-waves के रूप में हवा के माध्यम से यात्रा का निर्माण।
केवल विस्थापन के मामले: एक स्थिर संकेत, भले ही अधिकतम, कोई आवाज उत्पन्न न हो: डायाफ्राम बस एक निश्चित स्थिति पर रहता है।
sampling frequency निर्धारित करता है कि विस्थापन कितनी तेजी से किया जाना चाहिए।
44,1kHz एक सामान्य नमूना आवृत्ति है क्योंकि मनुष्य 20kHz तक और Nyquist–Shannon sampling theorem की वजह से सुन सकते हैं।
नमूना आवृत्ति वीडियो के लिए एफपीएस के समान है, हालांकि 25 (सिनेमा) - 144 (कट्टर गेमिंग मॉनीटर) रेंज की तुलना में इसका बहुत अधिक मूल्य है जो हम आम तौर पर वीडियो के लिए देखते हैं।
प्रारूप
.raw
एक underspecified प्रारूप है कि बस आयाम बाइट का है, और कोई मेटाडाटा है।
हमें नमूना आवृत्ति जैसे कमांड लाइन पर कुछ मेटा-डेटा पैरामीटर पास करना होगा क्योंकि प्रारूप में वह डेटा नहीं है।
अन्य असम्पीडित प्रारूप भी हैं जिनमें सभी आवश्यक मेटाडेटा शामिल हैं, उदा। .wav
, देखें: WAV File Synthesis From Scratch - C
हालांकि, अधिकांश लोग संकुचित प्रारूपों के साथ विशेष रूप से सौदे करते हैं, जो फाइलें/स्ट्रीमिंग को बहुत छोटा बनाते हैं। उन प्रारूपों में से कुछ प्रारूपों को हानिकारक तरीके से ऑडियो को संपीड़ित करने के लिए मानव कान की विशेषताओं को ध्यान में रखते हैं।
जीवविज्ञान
मनुष्य अपनी आवृत्ति अपघटन (उर्फ Fourier transform) द्वारा ज्यादातर ध्वनि अनुभव।
मुझे लगता है कि ऐसा इसलिए है क्योंकि आंतरिक कान में ऐसे हिस्सों होते हैं जो विभिन्न आवृत्तियों (TODO पुष्टि) के लिए गूंजते हैं।
इसलिए, संगीत को संश्लेषित करते समय, हम समय के बजाय आवृत्तियों को जोड़ने के मामले में अधिक सोचते हैं। यह in this example सचित्र है।
यह प्रत्येक बिंदु के लिए 20 हर्ट्ज और 20kHz के बीच 1 डी वेक्टर के मामले में सोचने की ओर जाता है।
गणितीय फूरियर ट्रांसफॉर्म समय की धारणा खो देता है, इसलिए संश्लेषण करते समय हम क्या करते हैं, अंक के समूह लेना और उस समूह के लिए आवृत्तियों को जोड़ना, और फूरियर को वहां बदलना है।
सौभाग्य से, फूरियर ट्रांसफॉर्म रैखिक है, इसलिए हम सीधे विस्थापन को जोड़ सकते हैं और सामान्यीकृत कर सकते हैं।
अंक के प्रत्येक समूह का आकार एक समय - आवृत्ति सटीक ट्रेडऑफ होता है, उसी गणित द्वारा मध्यस्थता Heisenberg's uncertainty principle के रूप में होता है।
Wavelets इस मध्यवर्ती समय - आवृत्ति विवरण का एक और सटीक गणितीय विवरण हो सकता है।
बहुत अच्छा स्पष्टीकरण, धन्यवाद! –
तकनीकी रूप से यह आयाम माप का एक गुच्छा है। ऐसा लगता है कि अधिकांश एडीसी आयाम का प्रतिनिधित्व करने के लिए वोल्टेज का उपयोग करते हैं। –
@SteveKuo तकनीकी रूप से बोलते हुए, यह सही है, लेकिन ऐसा लगता है कि किसी भी सार्थक तरीके से इस मुद्दे को बहुत जटिल बना दिया जाएगा। और चूंकि यह एक विद्युत इंजीनियरिंग साइट नहीं है ... – derobert