2009-05-20 20 views
6

यदि मैं स्पीकर के साथ रीयलटोन खेलने के लिए एक माइक्रोक्रोनरोलर (ATMega128) प्रोग्राम करना चाहता था, तो मैं यह कैसे करूँगा?स्पीकर को ध्वनि कैसे भेजें

क्या मुझे विभिन्न आयाम मान भेजने के लिए डिजिटल/एनालॉग कनवर्टर का उपयोग करने की आवश्यकता है, या यह आवृत्ति परिवर्तन के साथ पर्याप्त है? किसी भी मामले में, मैं स्पीकर को प्राप्त करने की आवृत्ति और आयाम मानों को कैसे एन्कोड करूं? क्या मुझे किसी प्रकार की फ्रीक्वेंसी मल्टीप्लेक्सिंग चाहिए? मैं केवल स्पीकर के साथ सरल आवाज बनाने के बारे में बात नहीं कर रहा हूं, जैसे एक नोट और फिर दूसरा। मैं सभी उपकरणों, vocals, आदि के साथ एक असली गीत खेलना चाहता हूं

उत्तर

0

आप open source MP3 player पर एक नज़र डाल सकते हैं और देख सकते हैं कि वे इसे कैसे करते हैं। मेरा अनुमान है कि आपको एक सभ्य गुणवत्ता की ध्वनि उत्पन्न करने के लिए एक डी/ए कनवर्टर की आवश्यकता होगी।

+0

दिलचस्प परियोजना है, लेकिन unluckyly वह "outsorced" ध्वनि एक तीसरी पार्टी चिप को हिस्सा डिकोडिंग:। "बोर्ड पर अन्य चिप वीएलएसआई, फिनलैंड से एक VS1011 है यह एक एमपी 3 और wav विकोडक चिप, एक डीएसी, और एक हेडफोन एम्पलीफायर सभी 28 पिन पैकेज में " मैं सीखने के लिए बस इसे स्वयं करने के बाद हूं :) – palako

6

मान लें कि आप एक असम्पीडित 8 बिट 22.1   kHz मोनो लहर फ़ाइल है:

1) हैडर
2) हर 1/22100 दूसरा बाहर पट्टी:
2.1) पढ़ें 8 बिट
2.2) यह वक्ता के वोल्टेज रेंज
2.3 कन्वर्ट करने के लिए एक डीएसी का प्रयोग करें) यह वक्ता

यह आपको दे देंगे [22.1   kHz/8 बिट/मोनो] गुणवत्ता ध्वनि को भेजें और यथार्थवादी नमूने खेलने के लिए एक आसान तरीका है ।

विभिन्न सिंथेसाइज़र के लिए सभी आवृत्ति सामग्री आवश्यक है। पीसी स्पीकर, उदाहरण के लिए प्रभावी रूप से एक बिट है। अलग-अलग आयामों ('कोई नहीं' और 'अधिकतम' की तुलना में) पल्स-चौड़ाई मॉड्यूलेशन जैसी कुछ चाल आवश्यक हो सकती हैं (जैसा कि आपने कहा था, आवृत्तियों को चारों ओर स्थानांतरित करें, इसलिए स्पीकर के डायाफ्राम प्रभावी ढंग से दो से अधिक पदों में हैं)।

लेकिन आपको इससे परेशान करने की आवश्यकता नहीं है। आपको केवल स्पीकर पर प्रति सेकंड 22,100 या 44,200 ध्वनि नमूने बाहर निकालना है, जिसमें आयाम को दर्शाने के लिए प्रति नमूना 8 या 16 बिट्स कहते हैं।

+0

बहुत रोचक। तो आपके उत्तर से मैं यह मान रहा हूं कि एक डब्ल्यूएवी फ़ाइल वास्तव में ध्वनि का एक बहुत यथार्थवादी प्रतिनिधित्व है। यह डब्ल्यूएवी को एनालॉग सिग्नल में बदलने का मामला है जो यह दर्शाता है। मैं इसे आज़मा दूंगा। – palako

+2

डीएसी भाग एक (अपेक्षाकृत) सरल आर -2आर सीढ़ी के साथ पूरा किया जा सकता है। http://en.wikipedia.org/wiki/Resistor_Ladder। – Evansbee

+1

यह डब्ल्यूएवी फ़ाइल पर निर्भर करता है। डब्ल्यूएवी प्रारूप में वास्तव में संकुचित ऑडियो हो सकता है - पूर्ण प्रारूप विनिर्देश यहां उपलब्ध है: http://msdn.microsoft.com/en-us/library/ms713497.aspx –

1

यदि आप विशेष रूप से रचनात्मक महसूस कर रहे हैं, तो आप resistor ladder का उपयोग करके अपना स्वयं का डिजिटल-टू-एनालॉग कनवर्टर बना सकते हैं।

0

आपके पास कुछ भी फैंसी करने के लिए ATMega128 पर पर्याप्त जगह नहीं है। सबसे आसान तरीका वक्ता (छोटे 2 "या उससे कम) कनेक्ट करने के लिए एक बाधा के माध्यम से है। उत्पादन की वर्तमान डूबने क्षमता की जाँच करें और उसके अनुसार आर गणना।

---------------------- +V 
    | 
    \ 
    /R 
    \ 
    /   ---------- 
    |    | 
    | ------  | 
    ----| |-----| Microcontroller 
     / \  | 
     -------- | 
     Speaker --------- 

के रूप में उत्पादन टन, उत्पादन के बुनियादी स्विचिंग के संबंध मूल स्टाइलफोन ध्वनि क्रैपोलिया का उत्पादन करेगा। आप किसी भी एनालॉग ध्वनि के अनुमान लगाने के लिए पल्स चौड़ाई मॉड्यूलेशन का उपयोग कर सकते हैं (यहां जाने के लिए बहुत जटिल है और एटमेगा में पर्याप्त पफ या स्टोरेज नहीं होगा)। यह ऑडियो ड्राइवर बनाने के लिए उपयोग की जाने वाली विधि थी अच्छे ओल 'दिनों में कोई ध्वनि कार्ड (केवल स्पीकर में निर्मित) वाले पीसी के लिए ...

2

आज 8-बिट माइक्रोकंट्रोलर से एमपी 3 फ़ाइलों को चलाने के लिए यह आसान और सस्ता दोनों है। आपको एक मेमोरी डी उपाध्यक्ष (उदाहरण के लिए एक एसडी कार्ड) और एक एमपी 3 चिपसेट। उदाहरण के लिए यह article देखें। आप avrfreaks पर कई और पा सकते हैं। वहां आप बाहरी चिप के बिना ध्वनि बजाने के लिए आलेख भी पा सकते हैं।

आप Pulse-width modulation (पीडब्ल्यूएम) के साथ मूल ध्वनियां चला सकते हैं, लेकिन वास्तविक गीत के लिए आपको एक डीएसी की आवश्यकता होगी। मैंने ऐसी परियोजनाएं देखी हैं जो केवल एक डीएसी और सॉफ्टवेयर का उपयोग करके एमपी 3 फाइलें बजाती हैं, लेकिन उनमें अधिक शक्तिशाली एआरएम माइक्रोकंट्रोलर शामिल थे।

0

यदि आप Arduino का उपयोग कर रहे हैं, तो आप $ 22 यूएसडी के लिए लेडी एडा के WaveShield खरीद सकते हैं। लेडी एडा क्रय के लायक कई Arduino goodies प्रदान करता है। कुछ उदाहरण जीपीएस, ईथरनेट और स्टेपर/सर्वो ढाल हैं।

+0

इस परियोजना के लिए एक आर्डिनो का उपयोग नहीं कर रहा है, केवल एटीएमगा, क्योंकि मुझे वास्तव में इसे लागू करने में दिलचस्पी है, अंतिम परिणाम नहीं। लेकिन मैं उस साइट को अपने arduino परियोजनाओं के लिए बुकमार्क किया गया है, धन्यवाद! – palako

4

मैंने कुछ ऐसा करने की कोशिश की है। सबसे पहले, आपके पास वास्तविक गीत संग्रहीत करने के लिए माइक्रोकंट्रोलर पर पर्याप्त स्मृति नहीं होगी। इसे संभालने के लिए आपको बाहरी मेमोरी की आवश्यकता होगी। इसका मतलब बाहरी फ्लैश या ईईपीरोम या कुछ के लिए एक एसपीआई इंटरफ़ेस का उपयोग करना है। एसडी भी अच्छा है - मुझे विश्वास है कि यह SPI शैली इंटरफ़ेस है। एसडी कार्ड में इंटरफेस करने के लिए एटीएमगास के लिए वहां कोड है।

दूसरा बड़ा सौदा डेटा को उचित प्रारूप में प्राप्त करना है। जिस तरह से मैं यह करूँगा अलग-अलग वोल्टेज स्तर बनाने के लिए pulse-width modulation (पीडब्लूएम) का उपयोग करना है। मेरा मानना ​​है कि आपके पास उस माइक्रोक्रोनरोलर पर 16-बिट पीडब्लूएम है ताकि आप अपनी आवाज पर 16-बिट निष्ठा प्राप्त कर सकें। यदि आपको अंतरिक्ष के साथ समस्याएं हैं तो आप इसके बजाय 8-बिट पीडब्लूएम का उपयोग कर सकते हैं। तो आपका ध्वनि डेटा 8x 16 बिट पीसीएम होना चाहिए जिसमें 0x0000 निम्नतम मूल्य और 0xFFFF उच्चतम है। यदि आप उच्च-निष्ठा संगीत चाहते हैं तो आपको सभी अच्छे हार्मोनिक्स और इस तरह के लिए 44   KHz की नमूना दर प्राप्त करनी होगी। मुझे विश्वास है कि यह पीसीएम है - जैसा कि इसे पीसी पर कहा जाता है।

तो फिर आपके पास ये सभी मूल्य होंगे - पांच मिनट के संगीत के लिए आपके पास 5 * 60 * 44000 = 13,200,000 16 बिट मान होंगे जो 211,200,000 बिट्स (211 मेगाबिट, 26.4 मेगाबाइट्स) हैं। कच्चे डेटा के लिए आपकी स्टोरेज आवश्यकताएं हैं। एमपी 3 एक संभावना है - इसके लिए बाहरी चिप्स हैं, लेकिन आपके पास अभी भी बड़ी जगह आवश्यकताएं होंगी।

तो एक सेकंड के प्रत्येक 1/44000 वें आप पीडब्लूएम रजिस्टर में एक मूल्य अपडेट करेंगे। आपकी पीडब्लूएम आवृत्ति 4 या 5 से अधिक होनी चाहिए - यानि, 5 पीडब्लूएम चक्र प्रति मूल्य।

यह आपका सामान्य एल्गोरिदम है - पीडब्लूएम रजिस्टर में मूल्य अपडेट करें और इसे अंत तक जाने दें। आपको आउटपुट पर कम से कम एक फ़िल्टर की आवश्यकता होगी - 20KHz की श्रव्य सीमा तक आवृत्तियों की सीमा (यदि आप ऑडिफाइल हैं तो अधिक)। एक आरसी फ़िल्टर काम करेगा लेकिन मैं एक सक्रिय फिल्टर के लिए जाऊंगा क्योंकि यदि आप पीडब्लूएम का उपयोग कर रहे हैं तो आपकी आउटपुट रेंज 0 से 5 वी तक होगी, आमतौर पर औसत वोल्टेज लगभग 2.5V होती है। वक्ताओं को डीसी स्तर पसंद नहीं है - बस सिग्नल। सुंदर साइन लहरें जिनमें 0 औसत वोल्टेज होता है। इसलिए आपके सक्रिय फ़िल्टर को वोल्टेज स्तर को समायोजित करना होगा और नकारात्मक वोल्टेज प्रदान करने के लिए दोहरी आपूर्ति का उपयोग करना होगा। आप बड़े पंपिंग बास के लिए सिग्नल को भी बढ़ा सकते हैं। बस अपने वक्ताओं को उड़ाओ मत।

एमपी 3 शायद पीसीएम के लिए एक बेहतर विकल्प है। वहां चिप्स हैं: http://www.sparkfun.com/commerce/product_info.php?products_id=8892

हालांकि, यह एक संपूर्ण माइक्रोकंट्रोलर है। और आपके पास पहले से ही एक है। लेकिन चलिए इसका सामना करते हैं - एटीमेगा जल्द ही एमपी 3 नहीं कर रहा है इससे कोई फर्क नहीं पड़ता कि आप इसे कैसे जैज़ करते हैं।

ऐसा लगता है कि उपरोक्त संदर्भित वावेशील्ड मूल रूप से ऐसा करता है - पीसीएम के भंडारण और ध्वनि के लिए बाहरी एम्पलीफायर के लिए एक एसडी कार्ड का उपयोग करता है। सौभाग्य!

+0

स्पार्कफ़न लिंक टूटा हुआ प्रतीत होता है। –

2

एक स्थिर स्वर उत्पन्न करने के लिए एक विधि डायरेक्ट डिजिटल सिंथेसिस है। आपको एक डीएसी, या तो एक समर्पित चिप या एक प्रतिरोधी सीढ़ी की आवश्यकता होगी।

आप आवृत्ति आप उत्पन्न करना चाहते हैं पर अतिप्रवाह के लिए एक काउंटर की स्थापना की, और काउंटर से प्रत्येक टिक पर आप सूचकांक एक wavetable के लिए इसका इस्तेमाल करने और अपने डीएसी के लिए एक निर्गम मूल्य मिलता है।

मैंने यहां Arduino के लिए New Noises From MidiVox पर दो अलग-अलग स्वर उत्पादन तकनीकों को लिखा है। डीएसी अद्यतन कोड मिडीवॉक्स (और एडफ्रूट वेवशील्ड) एमसीपी 4 9 2121 के लिए विशिष्ट है, लेकिन साइन लहर उत्पादन आम तौर पर लागू होना चाहिए।मैं कोड ज्यादातर ATmegas को सामान्य बनाने का प्रयास किया है, लेकिन वहाँ है कि में crept Arduino-वाद के एक जोड़े हैं।

कि पद से चिपकाया गया है, यहाँ एक MCP4921 साथ एक Arduino पर एक 440Hz स्वर खेलने के लिए कुछ कोड है एसपीआई बस में:

uint16_t sample = 0; 

/* incr = freq * (2^16/15625) 
* So for 440Hz, incr = 1845 */ 
uint16_t incr = 1845; 

/* oscillator position */ 
uint16_t pos = 0; 

const uint8_t sine[] = { 
    0x80, 0x83, 0x86, 0x89, 0x8C, 0x8F, 0x92, 0x95, 0x98, 0x9B, 0x9E, 0xA2, 
    0xA5, 0xA7, 0xAA, 0xAD, 0xB0, 0xB3, 0xB6, 0xB9, 0xBC, 0xBE, 0xC1, 0xC4, 
    0xC6, 0xC9, 0xCB, 0xCE, 0xD0, 0xD3, 0xD5, 0xD7, 0xDA, 0xDC, 0xDE, 0xE0, 
    0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEE, 0xF0, 0xF1, 0xF3, 0xF4, 
    0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 
    0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 
    0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xF4, 0xF3, 0xF1, 
    0xF0, 0xEE, 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 
    0xDA, 0xD7, 0xD5, 0xD3, 0xD0, 0xCE, 0xCB, 0xC9, 0xC6, 0xC4, 0xC1, 0xBE, 
    0xBC, 0xB9, 0xB6, 0xB3, 0xB0, 0xAD, 0xAA, 0xA7, 0xA5, 0xA2, 0x9E, 0x9B, 
    0x98, 0x95, 0x92, 0x8F, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x77, 
    0x74, 0x71, 0x6E, 0x6B, 0x68, 0x65, 0x62, 0x5E, 0x5B, 0x59, 0x56, 0x53, 
    0x50, 0x4D, 0x4A, 0x47, 0x44, 0x42, 0x3F, 0x3C, 0x3A, 0x37, 0x35, 0x32, 
    0x30, 0x2D, 0x2B, 0x29, 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 
    0x16, 0x15, 0x13, 0x12, 0x10, 0x0F, 0x0D, 0x0C, 0x0B, 0x0A, 0x08, 0x07, 
    0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 
    0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 
    0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x12, 0x13, 0x15, 
    0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x29, 0x2B, 0x2D, 
    0x30, 0x32, 0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x42, 0x44, 0x47, 0x4A, 0x4D, 
    0x50, 0x53, 0x56, 0x59, 0x5B, 0x5E, 0x62, 0x65, 0x68, 0x6B, 0x6E, 0x71, 
    0x74, 0x77, 0x7A, 0x7D 
}; 

void setup() { 
    cli(); 

    /* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz, 
     this gives a timer interrupt at 15625Hz. */ 
    TIMSK2 = (1 << OCIE2A); 
    OCR2A = 127; 

    /* clear/reset timer on match */ 
    TCCR2A = 1<<WGM21 | 0<<WGM20; /* CTC mode, reset on match */ 
    TCCR2B = 0<<CS22 | 1<<CS21 | 0<<CS20; /* clk, /8 prescaler */ 

    SPCR = 0x50; 
    SPSR = 0x01; 
    DDRB |= 0x2E; 
    PORTB |= (1<<1); 

    sei(); 
} 

ISR(TIMER2_COMPA_vect) { 
    /* OCR2A has been cleared, per TCCR2A above */ 
    OCR2A = 127; 

    pos += incr; 

    /* shift left a couple of bits for more volume */ 
    sample = sine[highByte(pos)] << 2; 

    PORTB &= ~(1<<1); 

    /* buffered, 1x gain, active mode */ 
    SPDR = highByte(sample) | 0x70; 
    while (!(SPSR & (1<<SPIF))); 

    SPDR = lowByte(sample); 
    while (!(SPSR & (1<<SPIF))); 

    PORTB |= (1<<1); 
} 

void loop() { 
} 

प्रत्यक्ष डिजिटल संश्लेषण के बारे में गंधा बात यह है कि यह कई टन एक साथ (इसके अलावा द्वारा) खेल सकते हैं या (जोड़ने से पहले मात्रा से गुणा) वांछित मात्रा में उन्हें मिश्रण के लिए बेहद आसान है।

मुझे पता चला है कि एक Arduino इस विधि का उपयोग कर लगभग 30 टन खेल सकता है। मेरा विशेष आवेदन Hammond organ simulation के लिए है, और यह भी उपयोगी पढ़ने को साबित कर सकता है।

संबंधित मुद्दे