Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.86 KB | None | 0 0
  1. using NAudio.Wave;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Media;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13.  
  14. namespace racVec_naloga3
  15. {
  16. public partial class Form1 : Form
  17. {
  18. byte[] buffer = null;
  19. short[] left = null;
  20. short[] right = null;
  21. short[] mid = null;
  22. short[] side = null;
  23. int read = 0;
  24. short[] sampleBuffer = null;
  25. string fileName = "";
  26. int frekvenca_vzorcenja = 0;
  27.  
  28. public Form1()
  29. {
  30. InitializeComponent();
  31. }
  32.  
  33. private void button_odpri_Click(object sender, EventArgs e)
  34. {
  35. OpenFileDialog ofd = new OpenFileDialog();
  36.  
  37. if(ofd.ShowDialog() == DialogResult.OK)
  38. {
  39. using (WaveFileReader reader = new WaveFileReader(ofd.FileName))
  40. {
  41. frekvenca_vzorcenja = reader.WaveFormat.SampleRate;
  42. buffer = new byte[reader.Length];
  43. read = reader.Read(buffer, 0, buffer.Length);
  44. sampleBuffer = new short[read / 2];
  45. Buffer.BlockCopy(buffer, 0, sampleBuffer, 0, read);
  46.  
  47. left = new short[sampleBuffer.Length/2];
  48. right = new short[sampleBuffer.Length / 2];
  49.  
  50. int k = 0;
  51. for (int i = 0; i < sampleBuffer.Length; i += 2)
  52. {
  53. left[k] = sampleBuffer[i];
  54. right[k] = sampleBuffer[i + 1];
  55. k++;
  56. }
  57.  
  58. mid = new short[sampleBuffer.Length / 2];
  59. side = new short[sampleBuffer.Length / 2];
  60.  
  61. for (int i = 0; i < sampleBuffer.Length/2; i++)
  62. {
  63. mid[i] = (short)((left[i] + right[i]) / 2.0);
  64. side[i] = (short)((left[i] - right[i]) / 2.0);
  65. }
  66.  
  67. fileName = ofd.FileName;
  68.  
  69. }
  70. }
  71. }
  72.  
  73. private void button_predvajanje_Click(object sender, EventArgs e)
  74. {
  75. SoundPlayer player = new SoundPlayer(fileName);
  76. player.Play();
  77. }
  78.  
  79. private void button_kompresija_Click(object sender, EventArgs e)
  80. {
  81. short[] buffer2 = new short[] { -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11};
  82. short[][] channels = new short[2][] { mid, side};
  83. //short[][] channels = new short[2][] { buffer2, buffer2 };
  84. int N = (int)numericUpDown_N.Value;
  85. int M = (int)numericUpDown_M.Value;
  86.  
  87. List<int> seznam = new List<int>();
  88.  
  89. //pisanje v datoteko - glava
  90. BinWriter writer = new BinWriter("out.bin");
  91. writer.writeValue(4 * 8, sampleBuffer.Length);
  92. //writer.writeValue(4 * 8, buffer2.Length);
  93. writer.writeValue(2 * 8, N);
  94. writer.writeValue(4 * 8, frekvenca_vzorcenja);
  95. writer.writeValue(2 * 8, M);
  96.  
  97. for (int c=0; c<channels.Length; c++)
  98. {
  99. int st_okvirjev = (int)Math.Ceiling((decimal)((channels[c].Length*1.0) / (N*1.0))) + 1;
  100. List<List<double>> bloki = new List<List<double>>();
  101. for (int i = 0; i < st_okvirjev; i++)
  102. bloki.Add(new List<double>());
  103.  
  104. for (int i = 0; i < N; i++)
  105. {
  106. bloki[0].Add(0);
  107. }
  108.  
  109. //okenska funkcija
  110. List<double> okenska = new List<double>();
  111. for (int i = 0; i < 2 * N; i++)
  112. {
  113. okenska.Add(Math.Sin((Math.PI / (2 * N)) * (i + 0.5)));
  114. }
  115.  
  116. //razdelitev arraya na bloke
  117. int i_buffer = 0;
  118. for (int i = 0; i < st_okvirjev; i++)
  119. {
  120. while (bloki[i].Count < 2 * N)
  121. {
  122. if (i_buffer < channels[c].Length)
  123. {
  124. bloki[i].Add(channels[c][i_buffer] * okenska[bloki[i].Count]);
  125. i_buffer++;
  126. }
  127. else
  128. bloki[i].Add(0);
  129. }
  130. i_buffer -= N;
  131. }
  132.  
  133. //MDCT
  134. int[,] MTDC = new int[st_okvirjev, N];
  135. for (int i = 0; i < st_okvirjev; i++)
  136. {
  137. for (int k = 0; k < N; k++)
  138. {
  139. double sestevek = 0;
  140. for (int n = 0; n < 2 * N; n++)
  141. {
  142. sestevek += bloki[i][n] * Math.Cos(Math.PI / N * (n + 0.5 + (N / 2.0)) * (k + 0.5));
  143. }
  144. MTDC[i, k] = (int)Math.Round(sestevek);
  145. }
  146. }
  147.  
  148. //kvantizacija
  149. if (M > 0)
  150. {
  151. for (int i = 0; i < st_okvirjev; i++)
  152. {
  153. for (int m = N - M; m < N; m++)
  154. {
  155. MTDC[i, m] = 0;
  156. }
  157. }
  158. }
  159.  
  160. //pisanje v datoteko
  161. for(int i=0; i<st_okvirjev; i++)
  162. {
  163. for(int j=0; j<N-M; j++)
  164. {
  165. int a = 5;
  166. if (MTDC[i, j] == -2907)
  167. a = 5;
  168. int dolzina = 0;
  169. if (MTDC[i, j] == 0)
  170. dolzina = 2;
  171. else if(Math.Log(Math.Abs(MTDC[i, j]), 2) == (int)Math.Log(Math.Abs(MTDC[i, j]), 2))
  172. dolzina = (int)Math.Ceiling(Math.Log(Math.Abs(MTDC[i, j]), 2) + 2);
  173. else
  174. dolzina = (int)Math.Ceiling(Math.Log(Math.Abs(MTDC[i, j]), 2) + 1);
  175. writer.writeValue(6, dolzina);
  176. writer.writeValue(dolzina, MTDC[i,j]);
  177. seznam.Add(MTDC[i, j]);
  178. }
  179. }
  180. }
  181.  
  182. writer.Closing();
  183. }
  184.  
  185. private void label2_Click(object sender, EventArgs e)
  186. {
  187.  
  188. }
  189.  
  190. private void button_dekompresija_Click(object sender, EventArgs e)
  191. {
  192. OpenFileDialog ofd = new OpenFileDialog();
  193. BinReader reader = null;
  194. if (ofd.ShowDialog() == DialogResult.OK)
  195. {
  196. reader = new BinReader(ofd.FileName);
  197. }
  198.  
  199. if(reader != null)
  200. {
  201. List<int> vrednosti = new List<int>();
  202. int st_vzorcev = 0;
  203. int N = 0;
  204. int sample_rate = 0;
  205. int M = 0;
  206.  
  207. st_vzorcev = reader.readValue(4 * 8, false);
  208. N = reader.readValue(2 * 8, false);
  209. sample_rate = reader.readValue(4 * 8, false);
  210. M = reader.readValue(2*8, false);
  211. int g = 0;
  212. while (reader.file.Position < reader.file.Length)
  213. {
  214. if (vrednosti.Count == 33542)
  215. g = 0;
  216. int dolzina = reader.readValue(6, false);
  217. vrednosti.Add(reader.readValue(dolzina, true));
  218. }
  219.  
  220. reader.file.Close();
  221.  
  222. int[] MTDC_mid = new int[vrednosti.Count/2];
  223. int[] MTDC_side = new int[vrednosti.Count / 2];
  224.  
  225.  
  226. for(int i=0; i<vrednosti.Count/2; i++)
  227. {
  228. MTDC_mid[i] = vrednosti[i];
  229. }
  230. for (int i = 0, j = vrednosti.Count / 2; i < vrednosti.Count / 2 && j < vrednosti.Count; i++, j++){
  231. MTDC_side[i] = vrednosti[j];
  232. }
  233.  
  234. short[] d_mid = new short[st_vzorcev/2];
  235. short[] d_side = new short[st_vzorcev / 2];
  236.  
  237. int[][] MTDC_array = new int[2][] { MTDC_mid, MTDC_side };
  238. short[][] channels = new short[2][] {d_mid, d_side};
  239. for (int c=0; c< MTDC_array.Length; c++)
  240. {
  241. int st_okvirjev = MTDC_array[c].Length / (N - M);
  242. int[,] MTDC = new int[st_okvirjev, N];
  243. int index = 0;
  244. for(int i=0; i<st_okvirjev; i++)
  245. {
  246. for(int j=0; j<N; j++)
  247. {
  248. if (j < N - M)
  249. {
  250. MTDC[i, j] = MTDC_mid[index];
  251. index++;
  252. }
  253. else
  254. MTDC[i, j] = 0;
  255. }
  256. }
  257.  
  258. //okenska funkcija
  259. double[] okenska = new double[2 * N];
  260. for (int i = 0; i < 2 * N; i++)
  261. {
  262. okenska[i] = (Math.Sin((Math.PI / (2 * N)) * (i + 0.5)));
  263. }
  264.  
  265. //IMDTC
  266. double[,] IMTDC = new double[st_okvirjev, 2*N];
  267. for(int i=0; i<st_okvirjev; i++)
  268. {
  269. for(int n=0; n<2*N; n++)
  270. {
  271. double vsota = 0;
  272. for(int k=0; k<N; k++)
  273. {
  274. vsota += MTDC[i, k] * Math.Cos(Math.PI / N * (n + 0.5 + N / 2.0) * (k + 0.5));
  275. }
  276. IMTDC[i, n] = (2.0 / N * vsota) * okenska[n];
  277. }
  278. }
  279.  
  280. int okvir_1 = 0;
  281. int okvir_2 = 1;
  282. int index_1 = N;
  283. int index_2 = 0;
  284. for(int i=0; i<channels[c].Length; i++)
  285. {
  286. channels[0][i] = (short)Math.Round(IMTDC[okvir_1,index_1] + IMTDC[okvir_2,index_2]);
  287. index_1++;
  288. index_2++;
  289. if(index_1 == 2 * N)
  290. {
  291. index_1 = N;
  292. index_2 = 0;
  293. okvir_1++;
  294. okvir_2++;
  295. }
  296. }
  297. }
  298.  
  299.  
  300. short[] d_left = new short[st_vzorcev / 2];
  301. short[] d_right = new short[st_vzorcev / 2];
  302.  
  303. for(int i=0; i<st_vzorcev/2; i++)
  304. {
  305. d_left[i] = (short)(d_mid[i] + d_side[i]);
  306. d_right[i] = (short)(d_mid[i] - d_side[i]);
  307. }
  308.  
  309. short[] d_buff = new short[st_vzorcev];
  310.  
  311. int ind = 0;
  312. for (int i = 0; i < st_vzorcev; i+=2)
  313. {
  314. d_buff[i] = d_left[ind];
  315. d_buff[i + 1] = d_right[ind];
  316. ind++;
  317. }
  318.  
  319. byte[] d_byte_buff = new byte[st_vzorcev*2];
  320. Buffer.BlockCopy(d_buff, 0, d_byte_buff, 0, st_vzorcev * 2);
  321.  
  322. using (WaveFileWriter w = new WaveFileWriter("out.wav", new WaveFormat(sample_rate, 2)))
  323. {
  324. w.Write(d_byte_buff, 0, st_vzorcev*2);
  325. }
  326.  
  327. }
  328. }
  329. }
  330. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement