library(ggplot2)
library(zoo)
## Warning: package 'zoo' was built under R version 4.1.2
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(ggthemes)
library(directlabels)
library(viridis)
## Loading required package: viridisLite
library(gridExtra)

setwd('/Users/brendo/repos/ggplot2-brendo61-byte')

center_speaker <- read.csv("fft_data/center_speaker.csv")
right_speaker <- read.csv("fft_data/right_speaker.csv")
# Data Organization
size = 200

# given that I used a pretty cheap mic 200 seems to be a fair number
# also the speaker also does not have a lot of output below 100Hz - this is known from the manufacturer

# Rolling AVG to smooth noise in recording
rolling_freq = rollmean(center_speaker$freq, size)

freqency_val = c(rolling_freq, rolling_freq, rolling_freq, rolling_freq)

applitudes = c(
  rollmean(center_speaker$X0, size), 
  rollmean(center_speaker$X15, size), 
  rollmean(center_speaker$X30, size), 
  rollmean(center_speaker$X45, size))

applitudes = 20 * log10(applitudes)

len = length(rolling_freq)
off_axis_degree = c(rep('0°', len),
                    rep('15°', len),
                    rep('30°', len),
                    rep('45°', len)
                    )


rolled_center_speaker = data.frame(freqency = freqency_val,
                                   amplitude = applitudes,
                                   degrees_off_axis = off_axis_degree
                                   )
center_plot = ggplot(data = rolled_center_speaker, 
              mapping = aes(x = freqency, y = amplitude, color = degrees_off_axis)) +
  geom_line(size = 0.4, show.legend = FALSE) + 
  directlabels::geom_dl(aes(label = degrees_off_axis), method = "first.qp") + 
  theme_classic() +
  theme_tufte(base_size=10, base_family = "sans") + 
  scale_y_continuous(limits = c(80, 121)) +
  scale_x_continuous(trans = "log10", limits = c(100, 20000), 
                     breaks = c(200, 2000, 20000),
                     minor_breaks = c(100, 300, 400, 500, 600, 700, 800, 900, 1000,
                                      3000, 4000, 5000, 6000, 7000, 8000, 9000,
                                      10000)
                     ) +
  theme(panel.grid.major.x = element_line(color = "grey", size = 0.25, linetype = 2)) + 
  theme(panel.grid.minor = element_line(color = "grey", size = 0.1, linetype = 1)) +
  ylab("Amplitude (dB)") + 
  xlab("Frequency (Hz)") + 
  labs(title = "Center Channel") + 
  theme(plot.title = element_text(size = 10.5)) +
    geom_vline(xintercept = 1000, linetype="solid", size = 0.3, show.legend = FALSE) +
  geom_text(aes(x=1000, label="\nX-Over", y=90, size = 4), colour="black", angle=90, show.legend = FALSE)


# center_plot
# Data Organization
size = 200

# again setting rolling mean size to 200
# the right channel will have more output under 100Hz - but the subwoofers are doing most of the heavy lifting there
# I don't care too much abouve < 100 Hz

# Rolling AVG to smooth noise in recording
rolling_freq = rollmean(right_speaker$freq, size)

freqency_val = c(rolling_freq, rolling_freq, rolling_freq, rolling_freq)

applitudes = c(
  rollmean(right_speaker$X0, size), 
  rollmean(right_speaker$X15, size), 
  rollmean(right_speaker$X30, size), 
  rollmean(right_speaker$X45, size))

applitudes = 20 * log10(applitudes)

len = length(rolling_freq)
off_axis_degree = c(rep('0°', len),
                    rep('15°', len),
                    rep('30°', len),
                    rep('45°', len)
                    )


rolled_right_speaker = data.frame(freqency = freqency_val,
                                   amplitude = applitudes,
                                   degrees_off_axis = off_axis_degree
                                   )
right_plot = ggplot(data = rolled_right_speaker, 
              mapping = aes(x = freqency, y = amplitude, color = degrees_off_axis)) +
  geom_line(size = 0.4, show.legend = FALSE) + 
  directlabels::geom_dl(aes(label = degrees_off_axis), method = "first.qp") + 
  theme_classic() +
  theme_tufte(base_size=10, base_family = "sans") + 
  scale_y_continuous(limits = c(80, 121)) +
  scale_x_continuous(trans = "log10", limits = c(100, 20000), 
                     breaks = c(200, 2000, 20000),
                     minor_breaks = c(100, 300, 400, 500, 600, 700, 800, 900, 1000,
                                      3000, 4000, 5000, 6000, 7000, 8000, 9000,
                                      10000)
                     ) +
  theme(panel.grid.major.x = element_line(color = "grey", size = 0.25, linetype = 2)) + 
  theme(panel.grid.minor = element_line(color = "grey", size = 0.1, linetype = 1)) +
  ylab("Amplitude (dB)") + 
  xlab("Frequency (Hz)") + 
  labs(title = "Right Channel",
              caption = "Frequency sweeps taken 1 meter from speaker at intevals of 15 degress off-axis relative to forward direction of speaker.\nSingnal below cross-over point is produced via woofer and above x-over via the tweeter.") + 
  theme(plot.title = element_text(size = 10.5), plot.caption = element_text(size = 8.5, hjust = 0)) + 
  geom_vline(xintercept = 800, linetype="solid", size = 0.3, show.legend = FALSE) +
  geom_text(aes(x=800, label="\nX-Over", y=90, size = 4), colour="black", angle=90, show.legend = FALSE)

# right_plot
grid.arrange(center_plot, right_plot, 
             ncol=1,
             top = "Off Axis Frequency Response of Speakers")
## Warning: Removed 8324 row(s) containing missing values (geom_path).
## Warning: Removed 8326 rows containing missing values (geom_dl).
## Warning: Removed 9419 row(s) containing missing values (geom_path).
## Warning: Removed 9419 rows containing missing values (geom_dl).